整数的特定(Java核心)

use*_*669 5 java

我在采访中得到了这个问题:

public Integer v1 = 127;
public Integer v2 = 127;
public Integer v3 = 513;
public Integer v4 = 513;

public void operatorEquals(){
    if (v1==v2)
        System.out.println("v1 == v2");
    else throw new RuntimeException("v1 != v2");
    if (v3==v4)
        System.out.println("v3 == v4");
    else throw new RuntimeException("v3 != v4");
}

**Result**: java.lang.RuntimeException: **v3 != v4**
Run Code Online (Sandbox Code Playgroud)

你能解释一下:为什么?我没有任何建议.

ppe*_*rka 10

Java Integer对象缓存到127,但不高于.

这种效果与String interning的工作方式非常相似,因此Integer值范围为[-128; 127]的所有对象也是相同的实例 - 通过引用相等性检查也返回true,(例如==),不仅使用.equals().

来自Arnaud Denoyelle的编辑

来自Integer.java:

public static Integer valueOf(int i) {
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
Run Code Online (Sandbox Code Playgroud)

  • 你能解释一下更详细......? (4认同)