整数の定数プールの動作: 数値境界を理解する
伝統的に、Java の定数プールは、同一の値に対して文字列リテラルを同様に扱うことが知られています。ただし、整数用定数プールの動作には微妙な違いがあります。これは 127 までの値には当てはまりますが、値がこのしきい値を超えると異なります。
この相違を理解するには、整数ラッパー オブジェクトとプリミティブ int 値の違いを認識することが重要です。 -128 ~ 127 の範囲内で整数リテラルを宣言すると、その整数リテラルは自動的に定数プールにインターンされます。その結果、「Integer i1 = 127; Integer i2 = 127;」など、同じ値に割り当てられた 2 つの変数は同じオブジェクト参照を指し、期待される結果である「i1 == i2」が true と評価されます。
ただし、int 値を Integer オブジェクトにボックス化すると、このダイナミックさが完全に変わります。文字列とは異なり、整数用定数プールはリテラル値のみをキャッシュします。これは、ボックス化操作自体が Java ヒープでの割り当てを開始することを意味します。次のスニペットを考えてみましょう: "Integer i1 = new Integer(127); Integer i2 = new Integer(127);"。この場合、両方の変数は同じ値を表しますが、定数プールには組み込まれていないため、別個のオブジェクトになります。この区別は、「i1 == i2」が false と評価されることに反映されています。
ここで、整数リテラルが 127 のしきい値を超えると、陰謀が生じます。この時点で、定数プールは、値がボックス化されているかどうかに関係なく、値をインターンしなくなりました。これは例「Integer i1 = 128; Integer i2 = 128;」で明らかであり、両方の変数が異なるオブジェクト インスタンスを参照し、「i1 == i2」は false と評価されます。
この変更の正当性動作は、Java 言語仕様 (JLS) で概説されている実装プラグマティクスに依存します。 JLS はプールされた値の狭い範囲に対してメモリの最適化を保証しますが、実装の裁量でより広い範囲のメモリの最適化が可能になります。ほとんどの Java 仮想マシン (JVM) は、遅延キャッシュや積極的なキャッシュなどの技術を活用して、より広範囲を利用することを選択しており、その結果、一般的なユースケースでの動作の期待を損なうことなくパフォーマンスが向上します。
以上がJava の定数プールが 127 を超える整数値を異なる方法で扱うのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。