ホームページ > Java > &#&チュートリアル > Java の整数ボックス化が「==」比較で「true」を返すこともあれば、「false」を返すこともあるのはなぜですか?

Java の整数ボックス化が「==」比較で「true」を返すこともあれば、「false」を返すこともあるのはなぜですか?

Barbara Streisand
リリース: 2024-12-23 00:50:14
オリジナル
400 人が閲覧しました

Why Does Integer Boxing in Java Sometimes Return `true` and Sometimes `false` for `==` Comparisons?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート