为什么使用 == 比较两个整数有时有效有时无效?

Why Comparison Of two Integer using == sometimes works and sometimes not?

我知道我在使用 == 时比较参考,这不是一个好主意,但我不明白为什么会这样。

Integer a=100;
Integer b=100;
Integer c=500;
Integer d=500;
System.out.println(a == b); //true
System.out.println(a.equals(b)); //true
System.out.println(c == d); //false
System.out.println(c.equals(d)); //true

正在缓存 -128 到 127 之间的整数值。

查看下面的源代码:

private static class IntegerCache {
    private IntegerCache(){}

    static final Integer cache[] = new Integer[-(-128) + 127 + 1];

    static {
        for(int i = 0; i < cache.length; i++)
            cache[i] = new Integer(i - 128);
    }
}

public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache 
        return IntegerCache.cache[i + offset];
    }
    return new Integer(i);
}

Java 语言规范说至少 -128 到 127 的包装器对象被 Integer.valueOf() 缓存和重用,这被自动装箱隐式使用。

缓存 -128 到 127 之间的整数(相同值的整数引用相同 Object)。比较你的 ab 引用 returns true,因为它们是相同的 Object。你的cd不在那个范围内,所以他们的参考比较returnsfalse.