为了账号安全,请及时绑定邮箱和手机立即绑定

JAVA中关于使用==和println时到底发生了什么

JAVA中关于使用==和println时到底发生了什么

至尊宝的传说 2019-05-21 17:06:02
Integera=1;Integerb=2;Longc=3L;//c=a+b;//编译出错,会出现int不能转为long的错误System.out.println(c==(a+b));//正常编译,结果为true为什么?我知道int和long相加的时候会都转化为long,和这个有关系吗?对于System.out.println(c==(a+b))首先会将a、b拆箱成int,然后相加,最后的结果应该是个int,c是个long,首先他们类型不同,IntegerCache和LongCache的地址肯定也不相同。还有,对于《深入理解JVM》中有这样一句话,“包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱”是什么意思
查看完整描述

2 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞

c==(a+b),三个包装型a,b,c全部拆箱
c=Long.longValue(c);返回基本数据类型long
a和b使用Integer.intValue(a);返回的是基本数据类型int,
c==(a+b)他们之间是基本类型数值的比较,所以为true
包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱上面的c==(a+b)有+号是算术运算符所以会自动拆箱如果是c==a,没有算术运算符不会拆箱,编译报错IncompatibleoperandtypesIntegerandLong
                            
查看完整回答
反对 回复 2019-05-21
?
慕村9548890

TA贡献1884条经验 获得超4个赞

c=a+b是c=a.intValue()+b.intValue()的简写,两个int相加结果还是int,必须显示转换为long才可以。比如c=(long)(a+b)。c==(a+b)是对比两个reference是不是指向同一个对象,jvm会优化一部分整数,我记得是-128到128的object。如果有两个整数一样,会指向同一个对象。比如Integera=12;Integerb=12;a==b是true。
                            
查看完整回答
反对 回复 2019-05-21
  • 2 回答
  • 0 关注
  • 430 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号