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

发布于 2022-09-07 08:17:42 字数 376 浏览 20 评论 0

Integer a = 1;
Integer b = 2;
Long c = 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》中有这样一句话,“包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱”是什么意思

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

巴黎夜雨 2022-09-14 08:17:42
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,没有算术运算符不会拆箱,编译报错Incompatible operand types Integer and Long

偷得浮生 2022-09-14 08:17:42

c=a+b是c = a.intValue() + b.intValue()的简写,两个int相加结果还是int,必须显示转换为long才可以。比如c = (long)(a+b)。c==(a+b)是对比两个reference是不是指向同一个对象,jvm会优化一部分整数,我记得是-128到128的object。如果有两个整数一样,会指向同一个对象。比如Integer a = 12; Integer b=12; a==b是true。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文