Java における驚くべき整数ボックス化動作
Java では、Integer オブジェクトはプリミティブ int 値のラッパーです。 int を Integer にボックス化する場合、通常は == 演算子がオブジェクトの値を比較することを期待します。ただし、場合によっては、== 演算子が代わりにオブジェクトの参照を比較します。この動作は、予期せぬ結果を招く可能性があります。
次のコードを考えてみましょう:
public class Scratch { public static void main(String[] args) { Integer a = 1000, b = 1000; System.out.println(a == b); Integer c = 100, d = 100; System.out.println(c == d); } }
実行すると、このコードが出力されます:
false true
最初の出力は予想どおりです。 : == は、2 つの異なる Integer オブジェクトの参照を比較します。しかし、2 番目の出力は驚くべきものです。 c と d が同じ値の場合に == が true を返すのはなぜですか?
答えは Java 言語仕様 (JLS) にあります。 JLS のセクション 5.1.7 によると:
ボックス化された値 p が true、false、バイト、u0000 ~ u007f の範囲の char、または -128 ~ 127 の int または short 数値の場合次に、r1 と r2 を p の任意の 2 つのボクシング変換の結果とする。常に r1 == r2 です。
これは、指定された範囲内のプリミティブ値から作成された Integer オブジェクトが同一の参照を持つことが保証されることを意味します。この場合、c と d は両方とも、-128 から 127 の範囲内にある同じ int 値 100 から作成されます。したがって、これらは同じ参照を持ち、== 演算子は true を返します。
出力の 2 行目の動作は保証されていますが、JLS は出力の 1 行目の動作は保証されていないことを示唆しています。理論上、Java 実装ではパフォーマンスを向上させるために共通の値の Integer オブジェクトをキャッシュできますが、JLS ではこの動作は必要ありません。その結果、Java 実装が異なれば、このケースの処理方法も異なる可能性があります。
以上がJava の `==` 演算子が整数オブジェクトの値を比較したり、参照を比較したりするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。