整数比较的JDK问题

时间:2011-08-01 07:43:53

标签: java

在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

5 个答案:

答案 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发布以来已经这样做了。

顺便说一句:您可以使用

增加整数缓存的大小
  • -Djava.lang.Integer.IntegerCache.high =值
  • -XX:AutoBoxCacheMax =值
  • -XX:+ AggressiveOpts

http://www.javaspecialists.eu/archive/Issue191.html

答案 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