ホームページ >Java >&#&チュートリアル >Java のオートボクシングで整数オブジェクトを比較すると一貫性のない結果が生じるのはなぜですか?

Java のオートボクシングで整数オブジェクトを比較すると一貫性のない結果が生じるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-27 18:46:15538ブラウズ

Why Does Java's Autoboxing Produce Inconsistent Results When Comparing Integer Objects?

Java のオートボックス化の不規則性: 謎の比較の調査

Java のオートボックス化機能は、プリミティブ値を対応するラッパー クラス オブジェクトに自動的に変換します。ただし、このような 2 つのオブジェクトを比較すると、特有の動作が発生します。

次のコード スニペットを考えてみましょう:

public class Scratch {
    public static void main(String[] args) {
        Integer a = 1000, b = 1000;
        System.out.println(a == b); // false

        Integer c = 100, d = 100;
        System.out.println(c == d); // true
    }
}

出力は私たちを困惑させます。最初の比較では false が返され、2 番目の比較では true が返されます。なぜそうなるのでしょうか?

謎の解明

出力の 2 行目は、Java 言語仕様 (JLS) によって保証されています。セクション 5.1.7 では、-128 から 127 までの整数を含む特定の範囲内のプリミティブ値は、常に同一のオブジェクトにボックス化されると述べています。

If the value p being boxed is ... an int or short number between -128 and 127, then ... r1 == r2.

これにより、一般的に使用される値は、一貫して区別できないオブジェクトとしてボックス化されます。

最初の曖昧さ比較

対照的に、最初の比較は JLS によって明示的に保証されていません。仕様では、実装が範囲内のオブジェクトをキャッシュすることを許可していますが、強制はしません。

したがって、より大きな整数をオブジェクトとして比較する動作は実装固有です。この場合、ランタイム環境が 'a' と 'b' に個別の参照を割り当てているようで、結果として 'false' が出力されます。

結論

Java のオートボックス化は便利ですが、特定のプリミティブ値を比較するときに厄介な点もあります。定義された範囲内の値は同一性を共有することが保証されていますが、より大きな整数は実装の選択に応じて異なる動作をする可能性があります。この知識は、予期しない動作を回避し、Java でのオブジェクト比較を制御し続けるのに役立ちます。

以上がJava のオートボクシングで整数オブジェクトを比較すると一貫性のない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。