如何看待问“a = a + b和a += b有什么区别”的Java面试官?

黄鑫


Java中a = a + b和a += b有俩点区别

  • 如果“=”或者“+=”俩边的数据类型不一样,那么“a += b”会进行自动类型从高向低转换,而“a = a + b”不会。

  • “a=a+b”多了一层中间变量的操作,导致执行效率低于“a+=b”,然而java编译期默认会对该操作进行优化,最终二者执行效率是一样的。

我觉得面试官问这个问题属于正常现象

相信很多初级开发人员对这个问题答案的认知停留在没有区别的层次上,虽然自己平时这俩种方法可能都用过,但也不会去细究二者的区别,而面试官问这个问题,应该是想对你的java基础知识的扎实程度做一个了解,要知道工作经验的长短并不是衡量一个人技术高低的标准,也有很多5年工作经验的开发,技术很差而想要浑水摸鱼的情况。毕竟开发也分低级、中级和高级,每个级别的薪资水平不一样,面试题目当然也不一样,低级和中级问的比较多的是java基础的一些问题,而高级开发则会问ssm的源码、基本原理、高并发、多线程等。

很多人可能对面试官的问题表示不屑一顾,感觉这么简单的问题拿来考我简直是对我的侮辱,亦或是觉得这种工作中根本用不到的问题拿来问简直是多此一举,甚至有几年工作经验的程序员直接拒绝笔试,我觉得这些都是一种错误的态度,真的的技术大牛应该是能够在任何问题面前宠辱而不惊,用自己的真正实力去证明自己。


以上为个人观点,欢迎在评论中发表自己不同的观点,喜欢的加个关注,谢谢。


架构师的成长史


哼哼哼,本姑娘,被Java吊打了两年的计算机专业学生来告诉你:千万别以为a=a+b和a+=b是一样的!

事实上,它们有一些类型和精度上的差异。

这两种形式的主要区别在于是否进行数据类型的自动转换,当两个操作数同类型时这两种形式的运算结果是没有差别的,当两个操作数数据类型不同时,且左操作数即保存结果的操作数的数据精度要低,此时这两种形式就有区别了。

上面这段话有点绕,举个例子:

public classDemo

{

public static void main(String[] args) {

short a=4;

int b=5;

a+=b;

System.out.println(a);

}

}

看这个简单的小程序,定义a是short型的变量,b是int型的变量,当执行a+=b时,能输出答案为9,程序没有问题的。

但是!!!

如果把代码稍微变一变:

public classDemo

{

public static void main(String[] args)

{

short a=4;

int b=5;

a=a+b;

System.out.println(a);

}

}

变成a=a+b之后,就会产生错误:



类型不匹配。

原因是:“+=”这个运算符在Java中是一个运算符,而不是两个,程序在执行“+=”时,会自动向高精度进行数据类型转换。所以第一个程序在执行时编译器没有报错。

而“=”呢,它要求=两边类型一致!我们的代码中,因为a是short类型的变量,而b为int类型的变量,short类型+int类型结果肯定会自动转换成int类型啦,此时就存在数据类型不一致的问题,用short类型的变量去保存int类型的变量编译器当然会报错了。

就好比你用装一两水的杯子去装二两水,当然是装不下的,如果你非要用装一两水的杯子去装二两水,肯定可以硬到进去,但是肯定会洒掉一部分水。所以如果这里非要用short类型的变量去装int类型的数据,可以用强制转换,确定是会丢失精度。

以下是强制转换后的结果:

public classDemo

{

public static void main(String[] args)

{

short a=4;int b=5;

a=(short)(a+b);

System.out.println(a);

}

}

强制转换之后,还是可以的了啦。

看到这里,你明白这两者的区别了吗?

没有明白的话,红红火火恍恍惚惚,问吧,还有哪里不明白!!!


hello程序媛


在Java中a= a+b与a += b在特定的情况是有区别的,只要有Java常识的都应该知道这些点吧。既然问到了,我看到很多人的回答就是给个demo演示一下,那么在这里详细的讲一下吧。

分析具体原因之前有必要先了解一下Java的4个基本知识点,了解之后还是不懂,可以来喷我。1、基本数据类型转换。Java的基本数据类型转换包含自动类型转换(也叫隐式类型转换)与强制类型转换(也叫显性类型转换)。

自动类型转换:当把小数据范围类型的数值或者变量赋给另一个大数据范围类型的变量,系统可自动完成转换。

强制类型转换:当把大范围类型的数值或变量赋给另一个小范围类型的变量时,此时系统不能自动完成类型转换,需要加上强制转换符。但这样的操作可能造成数据精度的降低或者溢出,所以使用时要格外的注意。

2、我们还得了解基本数据类型在Java中占位情况。如下图所示:

3、表达式类型的自动提升:当一个算术表达式中包含多个基本数据类型(boolean除外)的值时,整个算术表达式的数据类型将在数据运算时出现类型自动提升。

4、Java中的基本数据类型中整型我们默认都是int型。

当我们清楚的知道基本数据类型的占位与数据类型的转换之后,还要知道在赋值符号 =、+=、-=等,它们其实都包含自动类型转换,但不能进行强制类型转换。

下面是我写的一个demo,大家看了之后应该能完全明白吧。

上面我注释中已经说明了隐式类型转换其实与强制类型转换差不多,不过只能把小数据范围类型转换为大数据范围的类型。当short b=30,b = b+30;30我们默认是int型,结合我上述的第三点表达式类型的提升,那么b+30的结果数据类型自动为int,而b的数据类型是short,int不能自动转为short,所以编译出错,编译出错说明语法错误。

而b += 30,其实是在底层就已经悄悄的给我做了自动转换,把数据类型转换为short。但是在转换时也是有前提的,最大的前提条件就是赋值符右边的运算结果是否超出左边变量的数据类型的最大数据范围。如果超出也是出错,这时候的出错我们成为数据紊乱。我还是以一个demo来演示一下吧:

说到这里,大家应该明白了所有的原理了吧。只要最后紊乱为什么是-127,不明白的可以在评论区留言交流,也可以私信我。希望我的讲解可以给你面试带来帮助,如果还是不明白的话,直接喷我吧,我也没办法啦。明白的人点个赞支持一下!


软件工程师胡八一


说实话,如果你的面试官喜欢问这种问题,你可以得到一个结论和做一个决定了!

这个结论是:这个面试官水平应该不算高!

这个决定是:这家公司不要去了吧!

中国大学编程基础教学最大误区之一:纠结于各种a++和++a等游戏

我曾经大学的时候,学习C语言的时候,就是用的某著名教授的畅销千万册的书籍,那时候给我的感觉就是这本书我真的是看不懂,感觉看得是迷迷糊糊的,完全不知道在讲什么,到了重点的指针什么的也感觉都是犹抱琵琶半遮面。

那时候我的C语言老师,最喜欢搞这种a++和++a的游戏,而且几乎每一次上机测验一定会有一个题目是关于这个的题。

甚至一度我都怀疑是我自己不行,因为听不懂,感觉老师讲的都是天书,而且感觉老师总是要花时间讲一些奇奇怪怪知识点,这就是我那时候对于C语言这门课最大的感觉。甚至一度连我这个曾经中学时代就看过一些VB书籍,而且自认为中学时代数学、物理好到爆的学生,都开始怀疑自己,是不是我逻辑思维有问题。

关键是按照老师的做,居然还能考高分,更可怕的是考了高分以后都不知道自己为什么考到的高分,是真的C语言学好了吗?显然不是!

后来我实在感觉已经快失去对C语言的最后一点信心了,只是觉得这样下去不行,我只好自己去百度、去Google,然后自己找资料,现在想想应该感谢这么课,然后我自己找到了C Primer Plus,最后找到了K&R C,让我明白不要过分纠结于语法游戏,对于真正学会编程到底是有多重要。

并且因为这门课让我没有被禁锢住,养成了我大学几年坚持用GitHub、stack overflow、Google、以及学会使用查官方文档的好习惯。

中国大学编程基础教学最大误区之二:万年不变VC6.0

这是我学生时代经历的又一大痛楚!

那个年代macOS不能用VC,Windows7上安装VC6.0也是极为痛苦的,我记得第一次上机实验的时候,我用codeblocks写了程序然后交上去,老师又让我用VC6.0重写了,于是我只好跑到机房去用那个windows XP上的VC6.0又把作业重新做了一遍提交上去。

我当时就在想,为什么我们的老师不能为了适应一下时代,就算是不用Xcode这种,用一下比较新版本的codeblocks/devc++,或者是用新一点的visual studio 2008也行啊,要知道VC6.0从1998年发布到现在足足二十年了!

总之,我觉得编程,应该更多的关注到编程本质上来,而不是纠结于那些对于编程水平并没有实质性提高的语法细节,多关注关注算法、数据结构我觉得价值更高!


EmacserVimer


在java语言中,a+=b和a=a+b的主要区别是在运算的精度上。类似的有“-= 、 *= 、/= 、%= ”,这里以a+=b 与 a=a+b 举例说明一下。

1. 下面是一串代码,我们试一下a=a+b的形式:

public class TestDemo {

public static void main(String[] args) {

byte a=1;

a=a+4;

System.out.println(a);

}

}

从图中可以看出出现了错误,根本无法运行。报错原因我也贴出来了,说是“类型不匹配:不能从int转换为byte”,

里因为a是byte类型,而数字4默认是int 类型。在java中,在a+4时,会进行 自动类型转换 ,所以a+4 会转换成int类型。而变量a还是byte类型,将int 类型的a+4赋值给byte类型的a ,无疑会报错。

当然,我们也可以进行强类型转换,将已经转换成int类型的a+4强制转换为byte类型,这样也是可以的。但是这种转换可能会导致溢出或者精度的下降,如果容忍可能出现的误差,可以使用这种转换。

下面是转换的结果:

public class TestDemo {

public static void main(String[] args) {

byte a=1;

a=(byte)(a+4);

System.out.println(a);

}

}

(2)下面试一试a+=b的形式

public class TestDemo {

public static void main(String[] args) {

byte a=1;

a+=4;

System.out.println(a);

}

}

我们发现结果是正确的,程序也没毛病。大家需要明确的是“+=”是java中的一个运算符,而不是两个,所以在运算时 会进行自动类型转换。所以在编译时没有报错。

(3),总结一下,在两个变量的数据类型一样时:a+=b 和a=a+b 是没有区别的。

但是当两个变量的数据类型不同时,就需要考虑一下数据类型自动转换的问题了。

也就是涉及到精度了。

————————————————

原文链接:https://blog.csdn.net/m0_38022029/article/details/79606104


我们的烟火气


如果仅仅从知识上来说,a = a+b 和 a += b 是不同的,前几天刚好看到有说这个问题的:

// s1是short类型, 1是int类型, s1 + 1 向上转型为 int 类型, 无法直接赋值给 short 类型, 需要强制类型转换

// short s1 = 1; s1 = s1 + 1;

// 显式赋值操作

short s1 = 1;

s1 = (short) (s1 + 1);


// 能通过编译, 隐式类型转换

// 计算操作, 直接转换

short s2 = 1;

s2 += 1;

System.out.println(s2);


总的老说,就是 a = a+b 会涉及到类型转换时,必须强制,强制,强制,就是(short)这种才行,否则IDE会提示编译本身就错误;但是 a += b 却不会,会进行影式类型转换,不要强制指定即可编译通过。


面试有时候就是看缘分,有些很基础的东西,老鸟也未必不被坑。编程中,很多东西还是要靠规范,而不是用一些特殊的操作行为来保证结果符合预期,这样是会被自己坑死的。面试问到了,想起来就说说,忘记了或者不确定就说不知道,不丢人。不必要耗费太多的精力在里面,这家不行,就赶紧腾出时间来去下一家。能一起共事,是缘分,不能,就是职场碰面,勤面试就好。


有骨有度


前言:虽然我的专业没有专门学习过Java语言,但是学习过由清华大学出版社

出版的C程序设计和C语言版的数据结构与算法,我能理解提问中Java面试官问到的“a=a+b和a+=b有什么区别”的问题,可以为您解答,希望对您有实际性或启发性的帮助。

a=a+b和a+=b有什么区别”准确来说应该是“a=a+b;和a+=b;有什么区别”,因为在无论是在Java语言还是在C语言中,分号都是程序代码必不可少的组成成份,每个分号是一个语句,没有分号只是一个表达式,表达式是没有比较意义的,而语句却可以比较,但a=a+b;和a+=b;”两个语句并没有严格意义上的区别,二者实现的功能都是把a+b的值赋值给a。前者简单、通俗,一般用于初学者的教学活动,后者可以体现出较强的专业性。在我学习过的C程序设计中有简单提到,但并没作区别介绍,只是建议初学者慎用“a+=b;”。

当面试官问到“a=a+b;和a+=b;有什么区别”的问题时,面试官想要的答案也许并不是要让您说出具体的区别,而是问您在敲代码时会使用哪一种语句来判断您的专业性。如果是我,我会简单说一下两个语句的功能作用,然后如实的告诉HR我更习惯使用“a=a+b;”语句来实现赋值,因为该赋值语句更通俗易懂,方便他人的阅读和理解。

结语:程序,是写给人看的计算机语言,除了分号是程序代码必不可少的组成成份外,注释也占有很重要的地位。一个具有可读性的程序代码注释是不可或缺的,如果不了解又想了解“//”和“/* */”两种注释方法的同学请给个赞和关注呗。


宋雨怀


如果面试中大量的问题和考验纠结于这种所谓的基础知识,我只能替这家公司感到担忧。在项目实践过程中,使用a=a+b还是a+=b,不会影响关键程序逻辑的构造。是否能讲出所谓的区别,也根本无法评估一个开发人员的能力高低。如今的软件开发行业技术迭代日新月异,各种语言、框架、开发理念设计模式层出不穷,而作为开发者需要时刻保持对新技术的学习掌握使用,根本没有过多的时间再去计较每一种技术的细微特性,并且是否了解这些细节特性实际上并不会对工作质量产生多大的影响。现代的软件开发人员在很多时候,碰到问题只求快速找到解决方案,以求及时解决当前面临的问题。例如本人非常频繁地使用MD5算法,但是自从接触编程以来,我就没有认真分析过MD5算法的具体实现过程。在早起的JDK1.4的年代基本类库中并没有提供直接的MD5加密工具类,我就谷歌上找了一段现成的代码。后来apache commons组件库提供了现成的各种加密算法工具包,我就直接使用这些组建工具进行日常开发。因为我个根本不需要掌握着这些加密算法的实现原理,这种加密解密方法在我眼里就是一种无需掌握细节便可满足日常工作的基础工具包。


微捷Kevin


你好,技术面试的话,针对java面试,我是深有体会的,因为我被别人面试过,反过来,我也面试过别人,这种面试既是对参加面试者的考验,也有很大程度是对面试官的一个考验,因为作为java面试官,一般他已经坐到了技术经理的位置,或则是一个公司的资深研发级别了。接下来我们从几个方面分析下问a+=b这种问题的java面试官。

1.技术经理

java面试其实也分几种初中高级别,作为一个公司的技术经理的话,如果是这种位置的人去面试你,问你这种a=a+b和a+=b区别的问题,一般他就是想看看你基础扎实不,如果他问出你这样的问题,那么在他心里他都会给你事先定好了一个级别了,初级,如果好一点的话,最多能给你定个中级java开发。技术经理是有这个权利的。你不要去想面试你的人水平怎么样,你作为应聘者,只管回答好面试官的问题好了。

2.资深研发

面试你的人也有可能是一个公司的资深研发,他看完你的简历,当你介绍完你的工作经历后,如果还问你这种a+b的问题,那么他很有可能只是想缓解下紧张的气氛,以这种他认为很简单的问题去打开你们之间的交流,让你不要那么紧张而已,这种情况,你就放平心态,好好回答就行了,当然了,这个问题也直接关乎你们接下来他会问你什么难度的问题,如果你答得很符合他的预期,他对你就很满意了,接下来也不会多么的难为你,可能会问你更加深入的问题,但是你答出个大概,加上他的提示你能继续下去,这个面试也就八九不离十了,当然,他是没权利给你定级别的,他会把你的面试情况反馈给上级,由上级决定你的级别。

其他情况,面试官问你这种问题,在中小型公司他也有可能只是一个中高级开发,或则是个项目经理也是有可能出现的。只是这种情况相对较少,我们就不多做描述了。

本人阅历有限,如各位看官有其他看法,欢迎多多指教,不胜感激。


IT讲坛


说实话,如果你的面试官喜欢问这种问题,你可以得到一个结论和做一个决定了!

这个结论是:这个面试官水平应该不算高!

这个决定是:这家公司不要去了吧!


如果硬要说他们两者之间的区别:在java语言中,a+=b和a=a+b的主要区别是在运算的精度上。


通常在两个变量的数据类型一样时:a+=b 和a=a+b 是没有区别的。

但是当两个变量的数据类型不同时,就需要考虑一下数据类型自动转换的问题了,也就是涉及到精度了。


分享到:


相關文章: