1

可能的重复:
奇怪的 Java 拳击

public class example {
    public static void main(String[] args) {

        Integer a=127,b=127;
        if(a==b)
            System.out.println("Equal");
        else
            System.out.println("Not Equal");
        Integer c=128,d=128;
        if(c==d)
            System.out.println("Equal");
        else
            System.out.println("Not Equal");
    }

}

输出:

Equal
Not Equal
4

3 回答 3

5

基本上 -127 和 127 之间的整数以这样的方式“缓存”,当你使用这些数字时,你总是在内存中引用相同的数字,这就是你的 == 起作用的原因。

该范围之外的任何整数都不会被缓存,因此引用是不一样的。

因此,当您尝试将 127 与 127 进行比较时,只制作了一个对象并且它工作正常,但是当您尝试使用 128 时,它超出了范围并创建了两个对象,因此您无法使用 == 运算符比较它们。

为此,请使用.equals()(比较对象参考) 方法。有关详细信息,请参阅此。

Integer c=128,d=128;
if(c.equals(d))
        System.out.println("Equal");
    else
        System.out.println("Not Equal");
于 2012-11-20T07:53:54.427 回答
0

来自 Integer.java 的源代码

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);
}
}

/**
 * Returns a <tt>Integer</tt> instance representing the specified
 * <tt>int</tt> value.
 * If a new <tt>Integer</tt> instance is not required, this method
 * should generally be used in preference to the constructor
 * {@link #Integer(int)}, as this method is likely to yield
 * significantly better space and time performance by caching
 * frequently requested values.
 *
 * @param  i an <code>int</code> value.
 * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
 * @since  1.5
 */
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);
}
于 2012-11-20T07:58:48.807 回答
0

发生这种情况是因为Integer[-128, 127] 范围内的数字存储在堆中。因此,当您比较对象引用而不是对象值并且两者都Integer a = 127指向Integer b = 127堆中的同一个对象时,您的表达式被评估为true.

Integer值超出该范围时,您将获得两个不同的对象,因此引用比较返回false

于 2012-11-20T07:54:58.563 回答