127 以降の整数定数プールの動作が異なる理由
Java の数値の定数プールは文字列の定数プールとは異なります。文字列にはコンパイル時の定数のみがインターンされますが、ボックス化操作には整数のラッパー型のプールが含まれます。
例:
int x = 10; int y = x + 1; Integer z = y; // Not a compile-time constant Integer constant = 11; System.out.println(z == constant); // true
JLS は、プールされた値の狭い範囲を保証します。
実際には、ほとんどの実装はボックス化操作に Integer.valueOf を使用しており、次のような動作になります:
Integer x = Integer.valueOf(100); Integer y = Integer.valueOf(100); System.out.println(x == y); // true
JLS セクションによると5.1.7:
-128 から 127 までの値は、ボックス化すると常に同一の参照を生成します。これは、共通の値が常に区別できないようにするための実際的な妥協案です。
ただし、この範囲外の値の場合は動作が変わります。効率上の理由から、実装ではこれらの値の共有参照が想定されていない場合があります。
これにより、パフォーマンスに大きな影響を与えることなく、ほとんどの状況で望ましい動作が保証されます。メモリ制限のある実装では、より広範囲の値をカバーするようにキャッシュを拡張できます。
以上が-128 ~ 127 の範囲外の整数値が Java の定数プールで異なる動作をするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。