可能重复:
最近,当我读到包装类的时候,我经历了一个奇怪的例子:
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这个案子有什么合理的解释吗?
谢谢
发布于 2011-01-09 06:50:30
对于第二种情况,==返回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,因为在必要的地方,它会解压缩它们,然后比较它们的原始值。
发布于 2011-01-09 06:52:13
整数i1 = 1000;
编译器将其理解为int,这就是为什么i1 == i2 // return true。
但是当i1和i2是大的==测试时,返回错误
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发布于 2011-01-09 06:55:38
我刚试了一下,所有的指纹都是
different objects正如预期的那样,因为您正在创建两个不同的包装器对象,即使它们恰好包含相同的值。
正如Amber在上述评论中所暗示的,
if(i1.equals(i2)) System.out.println("same value");真的打印
same valuehttps://stackoverflow.com/questions/4638023
复制相似问题