Javaで数値リテラルをコンパイルし、それをInteger(大文字I
)に割り当てると、コンパイラーは以下を発行します。
Integer b2 =Integer.valueOf(127)
このコード行は、オートボクシングを使用したときにも生成されます。
valueOf
特定の数値が「プール」されるように実装され、128より小さい値に対して同じインスタンスを返します。
Java 1.6ソースコードの621行目:
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
の値はhigh
、システムプロパティを使用して別の値に設定できます。
-Djava.lang.Integer.IntegerCache.high = 999
そのシステムプロパティでプログラムを実行すると、trueが出力されます。
明白な結論:2つの参照が同一であることに決して依存せず、常にそれらを.equals()
メソッドと比較してください。
したがってb2.equals(b3)
、b2、b3のすべての論理的に等しい値に対してtrueを出力します。
Integer
キャッシュはパフォーマンス上の理由からではなく、JLSのセクション5.1.7に準拠していることに注意してください。オブジェクトIDは、-128から127までの値に指定する必要があります。
Integer#valueOf(int)もこの動作を文書化します:
この方法では、頻繁に要求される値をキャッシュすることにより、スペースと時間のパフォーマンスが大幅に向上する可能性があります。このメソッドは常に-128から127までの範囲の値をキャッシュし、この範囲外の他の値をキャッシュする場合があります。