分享生活百科知识

注册/登录|最近发布|今日推荐

主页 综合百科生活常识数码科技传统文化互联网健康时尚影视娱乐教育学习
当前位置:首页 > 传统文化

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

提问时间:2023-07-05 12:04关键词:区别,面试

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

点赞1、防城港市 网友:一生热爱

哼哼哼,本姑娘,被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);

}

}

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

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

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

点赞2、新沂市 网友:怪魔魚

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

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

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

中国大学编程基础教学最大误区之一:纠结于各种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年发布到现在足足二十年了!

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

点赞3、遵义市 网友:相顾无言

从运维人员角度来说,a=a+b会比a+=b好,主要不是为了性能,不是为了节省计算步骤,或者代码比较漂亮。就是为了别人读代码能更简单的理解你的逻辑。

a=a+b基本需要初中数学就懂得的公式。但是a+=b都需要有编程语言背景的才能看懂,而且java,c,c++,Python,perl各种各样编程语言都有他的特性。有的先算左边有的先算右边,这个在无形中加重了阅读和接手代码的难度。因为大型项目,开发人员50人以上的,人员流动十分十分频繁,而且新招聘往往都是比较新手的,代码写法越粗俗接手的人员要求越低,二次修改导致的bug的概率会越低。有助于项目的成功。

而且现在机器的计算能力已经这么强了,普通的业务代码强烈要求使用a=a+b,对于那些架构师大拿写的框架或者底层代码需要考虑性能的,那就根据实际情况选择了。

点赞4、许昌市 网友:奢侈品

如果仅仅从知识上来说,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 却不会,会进行影式类型转换,不要强制指定即可编译通过。


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

点赞5、偃师市 网友:不想追问

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

1.技术经理

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

2.资深研发

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

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

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

点赞6、常熟市 网友:两袖清风

a=a+b 是加法运算,需要两次寻址。a+= b是增量运算,有寄存器优先时,只有一次寻址。赋值运算是一样的。一般情况下可认为两者一样。但前者与数学算法描述更接近,相对来说更严谨。后者书写快捷,但可读性略有下降。综合考虑,还是用a= a+ b形式更好,毕竟可读性更好,效率差异微乎其微,在高速运算时代基本可忽略。

点赞7、珠海市 网友:杀破塔狼

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

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

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

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

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

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


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

点赞8、大理白族自治州 网友:笑颜百景

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

点赞9、牡丹江市 网友:傲血狂沙

说实话我也不知道啥区别。

实际验证了一下,发现有点区别。

前者指令是iadd等四步指令,后者指令是iinc或者iinc_w。iinc指令把前者四步指令打包成一个了。

Java不是解释性语言,这种指令缩减只在理论上,没有实际意义上的性能提升。Java的iadd指令特性也不会因为变个写法就不一样。否则就不需要原子化,可见性的一些特殊处理了。

个人推测,Java还用解释器的历史遗留。现在实际使用没有什么区别。

点赞10、增城市 网友:半凡。

一种观点,从这个问题看面试官对基本功的要求还是比较高的,重点考察的是面试者的基础知识是否扎实。

基础知识比较扎实的小伙伴儿,在高并发、高性能场景下的更多解决问题的方法。

比如这样看似差别不大的两个语句,在千万次调用时,可能就会有比较大的区别,而这块儿知识不扎实的小伙伴儿,根本不会意识到系统方法或者语法带来的隐患,自然就没有解决的入口。

另一种观点,面试官比较在意细节,实际开发中,很少使用,感觉这种问题是吹毛求疵的。

这就看自己怎么看待这家公司的意向了,个人更赞同第一种观点。

欢迎大家一起交流、讨论,我是职场逍遥。

点赞11、牡丹江市 网友:吟唱寒荒

a+=b 会自动隐式转换 ,将b转换为a类型.

a=a+b 不会自动转换 需要手动

点赞12、永州市 网友:君莫忘

我觉得问这个问题也挺正常的,能回答出来说明你的基础以及一些细节方面是不错的,还有就是让面试官觉得你是做好了面试准备的。一般技术官都从基础问起吧,然后再一层层套,直到你回答不出了。这是人家自然估摸出你大概的水平了。我觉得一上来就谈框架结构知识,并发之类的有点扯。

知识推荐

八哥问答——日常生活学习知识分享。 垃圾信息处理邮箱 tousu669@163.com 网站地图
icp备案号 闽ICP备2023007808号-3 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.12606.com All Rights Reserved