java奇怪的包装器类行为==和=
Possible Duplicate:
Weird Java Boxing
最近,当我阅读包装器类时,我遇到了一个奇怪的情况:
Integer i1 = 1000;
Integer i2 = 1000;
if(i1 != i2) System.out.println("different objects");
if(i1 == i2) System.out.println("same object");
其中打印:
different objects
及
Integer i1 = 10;
Integer i2 = 10;
if(i1 != i2) System.out.println("different objects");
if(i1 == i2) System.out.println("same object");
其中打印:
same object
这个案子有什么合理的解释吗
谢谢
# 1 楼答案
对于第二种情况,
==
返回true的原因是包装器装箱的原语值足够小,可以在运行时保留为相同的值。因此他们是平等的在第一种情况下,Java的整数缓存不够大,无法包含数字1000,因此最终会创建两个不同的包装器对象,通过引用比较,结果返回false
所述缓存的使用可以在
Integer#valueOf(int)
方法中找到(其中IntegerCache.high
默认为127):正如Amber所说,如果使用
.equals()
,那么这两种情况都将始终返回true,因为它会在必要时解除对它们的绑定,然后比较它们的原始值# 2 楼答案
整数i1=1000
编译器将其理解为int,这就是为什么
i1 == i2 // return true
但是,尽管
i1
和i2
是big==测试返回false注意:
对于对象,不要使用==测试相等性。它只是比较他们的参考
.equal()
检查两个对象是否相同# 3 楼答案
我刚试过这个,它给我留下的只是
正如预期的那样,因为您正在创建两个不同的包装器对象,即使它们碰巧包含相同的值
正如Amber在上述评论中暗示的那样
真的会打印吗