为什么First if if打印Equal和Second Not Equal?

时间:2012-11-20 07:50:40

标签: java

  

可能重复:
  Weird Java Boxing

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

3 个答案:

答案 0 :(得分:5)

基本上-127到127之间的整数以这种方式“缓存” 当你使用这些数字时,你总是引用相同的数字 记忆,这就是你的==工作的原因。

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

因此,当您尝试将127与127进行比较时,只有一个对象 制作完成并且工作正常,但当你尝试使用128时,它就出现了 范围和它创建了两个对象,因此您无法使用它们进行比较 ==运营商。

为此目的,使用 .equals()(比较对象引用)方法。请参阅 this了解更多详情。

Integer c=128,d=128;
if(c.equals(d))
        System.out.println("Equal");
    else
        System.out.println("Not Equal");

答案 1 :(得分:0)

这是因为范围[-128,127]内的Integer个数字存储在堆中。因此,当您比较对象引用而不是对象值时,Integer a = 127Integer b = 127都指向堆中的同一对象,您的表达式将被计算为true

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

答案 2 :(得分: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);
}