奇妙な Java 整数ボックス化
Java の整数ボックス化メカニズムは、特に参照の等価性を比較する場合に、少し混乱する可能性があります。
問題
次のコード スニペットを考えてみましょう:
public class Scratch { public static void main(String[] args) { Integer a = 1000, b = 1000; System.out.println(a == b); // false Integer c = 100, d = 100; System.out.println(c == d); // true } }
実行すると、次のものが生成されます:
false true
1 行目 a と b は異なるオブジェクトであるため、結果は期待通りです。しかし、2 行目の結果はどうなるでしょうか?
Answer
2 行目の真の結果は言語仕様によって保証されています。セクション 5.1.7 によると:
ボックス化される値 p が true、false、u0000 ~ u007f の範囲の byte または char、または -128 ~ 127 の int または short の場合、任意の結果p 上の 2 つのボックス変換、r1 と r2 は常に等しくなります。
出力の 2 行目は保証されていますが、最初の行は保証されていません (下記の最後の段落を参照):
理想的には、プリミティブ値 p が与えられると、ボクシングは常に同じものを生成します。参照。実際には、これは既存の実装技術を使用しては不可能な場合があります。上記のルールは実用的な妥協案です。上記の最後の節では、特定の共通の値を常に区別できないオブジェクトにボックス化する必要があります。実装では、遅延または即時にキャッシュしてもよい(MAY)。
他の値の場合、この表現では、プログラマはボックス化された値の同一性についていかなる仮定も行うことができません。これにより、これらの参照の一部またはすべての共有が可能になります (ただし、強制はされません)。
これにより、ほとんどの一般的なケースで、特に小型デバイスで不必要にパフォーマンスを損なうことなく、動作が望ましい動作になることが保証されます。メモリの制約が少ない実装では、-32K ~ 32K の範囲の整数と長整数だけでなく、すべての文字と短整数もキャッシュできます。
以上がJava の整数ボックス化が「Integer == Integer」の比較で異なる結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。