首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java包装类对象相等-奇数行为

Java包装类对象相等-奇数行为
EN

Stack Overflow用户
提问于 2011-08-02 11:37:43
回答 2查看 1.5K关注 0票数 4

可能重复: 包装类和==运算符

似乎包装类的对象相等操作符会产生不同的结果,这取决于包装值是否在字节范围内。下面是演示此行为的代码片段:

代码语言:javascript
运行
复制
System.out.println("smaller than byte");

Integer i1 = 1;

Integer i2 = 1;

if (i1 == i2) System.out.println("same");

if (i1 != i2) System.out.println("not same");

System.out.println("larger than byte");

Integer i3 = 128;

Integer i4 = 128;

if (i3 == i4) System.out.println("same");

if (i3 != i4) System.out.println("not same");

产生以下输出:

代码语言:javascript
运行
复制
smaller than byte

same

larger than byte 

not same

注意:我在linux上的HotSpot (Build1.6.0_24-b07)上获得了这个输出。同样的情况发生在很长的时间里,也可能是很短的时间(不过还没有测试)。

注意:在linux下的其他HotSpot构建上的相同输出,有人能解释吗?

小编辑,只是为了使它稍微更有趣:

添加

代码语言:javascript
运行
复制
if (i3 <= i4 && i3 >= i4) System.out.println("same after all...");

最后打印"same after all...“。

EN

回答 2

Stack Overflow用户

发布于 2011-08-02 11:39:27

是这样的。JVM将在自动装箱小值时“缓存”并重用Integer实例。

参见Java语言规范第5.1.7节拳击转换

如果被装箱的值p是true__,false__,一个字节,在\u0000\u007f__,范围内的一个字符,或者在-128到127__之间的一个int或短数,那么让r1和r2是p的任意两次装箱转换的结果。r1 == r2总是这样。

当比较使用Integer<><=>=时,与!===相比,值是不装箱的。

票数 4
EN

Stack Overflow用户

发布于 2011-08-02 12:05:54

-127到127之间的整数是“缓存”的,因此它们返回相同的引用,这意味着i1和i2指向同一个对象。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6911419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档