可能重复:
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
这个案子有没有合理的解释?
由于
答案 0 :(得分:9)
==
为第二种情况返回true的原因是因为包装器装箱的原始值足够小,无法在运行时插入到相同的值。因此他们是平等的。
在第一种情况下,Java的整数缓存不足以包含数字1000,因此您最终会创建两个不同的包装器对象,比较哪个通过引用返回false。
可以在Integer#valueOf(int)
方法中找到所述缓存的使用(其中IntegerCache.high
默认为127):
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
正如Amber所说,如果你使用.equals()
,那么两种情况都会返回true,因为它会在必要时将它们拆开,然后比较它们的原始值。
答案 1 :(得分:1)
整数i1 = 1000;
编译器将其理解为int i1 == i2 // return true
但是i1
和i2
很大= =测试返回false
Integer i1 = 10000000;
Integer i2 = 10000000;
if(i1 != i2) System.out.println("different objects"); // true
if(i1 == i2) System.out.println("same object"); // false
通知:
Integer i1 = 100;
Integer i2 = 100;
System.out.println(i1 == i2); // true
i1 = 1000000;
i2 = 1000000;
System.out.println(i1 == i2); // false
不要使用==测试对象的等式。它只是比较他们的参考。 .equal()
检查两个对象是否相同。
Integer i1 = 1000000;
Integer i2 = 1000000;
i1 == i2 // false
i1.equals(i2) // true
答案 2 :(得分:-1)
我刚试过这个,所有打印的都是
different objects
正如预期的那样,因为您正在创建两个不同的包装器对象,即使它们碰巧包含相同的值。
正如Amber在上述评论中暗示的那样,
if(i1.equals(i2)) System.out.println("same value");
确实打印
same value