5

面接でこんな質問を受けました。

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**

説明できますか: なぜですか? 提案はありません。

4

2 に答える 2

10

JavaIntegerオブジェクトは 127 までキャッシュされますが、それを超えることはありません。

この効果は、文字列のインターンの仕組みと非常に似ているため、[ - Integer128;127] の範囲の値を持つすべてのオブジェクトも同じインスタンス==です。 .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);
}
于 2013-10-02T18:28:23.297 に答える