Javaで数値リテラルをコンパイルし、それを整数(大文字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
、systemプロパティを使用して別の値に構成できます。
-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の範囲の値をキャッシュし、この範囲外の他の値をキャッシュする場合があります。