Java における整数ボックス化の奇妙さを理解する
Java では、整数のようなプリミティブ データ型には、Integer などの対応するラッパー クラスがあり、オブジェクト指向の機能を提供します。これらの値がボックス化およびボックス化解除されると、驚くべき結果が生じる可能性があります。
そのような観察の 1 つは、次のコードから得られます。
public class WeirdBoxing { 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
最初の比較では false が返されるのに、2 番目の比較では true が返されるのはなぜですか? == 演算子に従って、参照は常に比較される必要があります。
「本当の」比較の背後にある謎
興味深いことに、本当の比較はまぐれではありません。 Java 言語仕様 (JLS) セクション 5.1.7 には次のように記載されています:
ボックス化された値 p が [...] -128 から 127 までの int または short の数値である場合、[...] then let r1 およびr2 は、p の任意の 2 つのボックス化変換の結果です。常に r1 == r2 です。
この場合、c と d は両方とも指定された範囲内の値を保持し、ボックス化された表現 (Integer オブジェクト) が同一になります。
非固定範囲比較の曖昧さ
対照的に、最初の比較は(a == b) は保証された等価性ルールに該当しません。 JLS は次の点を強調しています:
他の値については、プログラマ側でボックス化された値の同一性に関するいかなる仮定も [規則] で禁止されています。
基本的に、固定範囲外の値をボックス化する場合、同一であるという保証はありません
結論
Java における整数ボックス化の奇妙な動作は、効率性と一般的な使用例を考慮した言語仕様の規定に起因しています。特定の範囲内の値は同一にボックス化されることが保証されますが、他の値の場合、ボックス化されたオブジェクトのアイデンティティは予測できません。この理解により、最初に示されたコード スニペットによって例示される「奇妙さ」が明らかになります。
以上がJava の整数ボックス化が「==」比較で「true」を返すこともあれば、「false」を返すこともあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。