在jdk 1.6.0_24中,具有相同int值的两个Integer对象的比较是否失败?
问题:
Integer x = 2;
Integer y = 2;
If(x != y){
//Control should not come here, but controls come here . In jdk 1.6.0_26 it is working.
}
如下所示,更改代码段的工作正常。
Integer x = 2;
Integer y = 2;
If(x.intValue() != y.intValue()){
//works fine.
}
任何答案?是jdk bug吗?
提前致谢。 Bhupendra Kalakoti
答案 0 :(得分:1)
正如马里奥已经暗示的那样,你会成为JVM的纯粹优化的牺牲品。高整数(“小”是模糊定义,取决于JVM版本和设置)被缓存,因此不需要不断创建(假设经常使用小数字)。
JVM供应商会不断更改默认所应用的优化,以便解释在更改版本时遇到差异的原因。
答案 1 :(得分:1)
我在这里找到的最好,最有趣的帖子之一:Strangest language feature
检查“有趣的自动装箱和Java中的整数缓存”(约498票)答案。
答案 2 :(得分:0)
Integer
是一个对象,其中int
是原始的。要比较您使用.equals
方法的对象。 ==
或!=
检查它们是否在堆中的相同地址,可能是TRUE
,也可能不是.intValue()
,因为缓存JVM适用于字符串和此类对象。
{{1}}比较正常,因为您正在比较这些对象的原始值。
答案 3 :(得分:0)
当您使用==对象时,您正在比较引用,即它们是同一个对象。 但是,当您使用== with primitives时,您正在比较它们的值。
在您的情况下,您正在使用已自动装箱的对象。对于Integer,调用Integer.valueOf()方法,它在-128和127之间缓存小值(默认最大值),并且自2004年Java 5.0发布以来已经这样做了。
顺便说一句:您可以使用
增加整数缓存的大小答案 4 :(得分:0)
我必须证明这一点 - 眼见为实所以他们说:
public class test
{
public static void main(String[] args) throws Exception
{
final Integer intValue2 = 2;
Integer intValue = Integer.valueOf("2");
System.out.println("INFO: intValue2 = " + intValue2);
System.out.println("INFO: intValue = " + intValue);
if (intValue2 == intValue)
System.out.println("PASS: Values are equal");
else
System.out.println("FAIL: Values are not equal");
}
}
使用Java 1.6.0_7:
INFO: intValue2 = 2
INFO: intValue = 2
FAIL: Values are not equal
使用Java 1.6.0_18:
INFO: intValue2 = 2
INFO: intValue = 2
PASS: Values are equal
然而,使用非“小”值,例如123456789,无论Java版本如何,这都会失败:
使用Java 1.6.0_7:
INFO: intValue2 = 1234567890
INFO: intValue = 1234567890
FAIL: Values are not equal
使用Java 1.6.0_18:
INFO: intValue2 = 1234567890
INFO: intValue = 1234567890
FAIL: Values are not equal