9

重複の可能性:
Javaの==
整数ラッパーオブジェクトでの一貫性のない動作は、値127内でのみ同じインスタンスを共有しますか?

整数オブジェクトの次の==動作を見つけましたが、理解できません。(私はそのような比較にequalsを使用する必要があることをよく知っていますが、私はOCPJPのために勉強しています...)

つまり、==は1000では期待どおりに機能しますが、10では機能しません。

以前のコードの断片は次のとおりです。

Integer i1 = 1000;
Integer i2 = 1000;
if(i1 != i2) System.out.println("different objects");
if(i1.equals(i2)) System.out.println("meaningfully equal");

期待どおりに動作します。

different objects
meaningfully equal

後者はしかし:

Integer i3 = 10;
Integer i4 = 10;
if(i3 == i4) System.out.println("same object");
if(i3.equals(i4)) System.out.println("meaningfully equal"); 

次の出力があります。

same object
meaningfully equal

誰かがこれが起こっている理由を説明できますか?

4

2 に答える 2

12

Java 5 以降、ラッパー クラス キャッシングが導入されました。以下は、Integer キャッシュにある内部クラス IntegerCache によって作成されたキャッシュの調査です。たとえば、次のコードはキャッシュを作成します。

Integer myNumber = 10

また

Integer myNumber = Integer.valueOf(10);

256 個の整数オブジェクトが -128 から 127 の範囲で作成され、すべて整数配列に格納されます。このキャッシュ機能は、Integer にある内部クラス IntegerCache を見るとわかります。

そのため、Integer.valueOf を使用してオブジェクトを作成するか、-128 から 127 の範囲内で値を Integer に直接割り当てると、同じオブジェクトが返されます。したがって、次の例を検討してください。

Integer i = 100;
Integer p = 100;
if (i == p)  
    System.out.println("i and p are the same.");
if (i != p)
    System.out.println("i and p are different.");   
if(i.equals(p))
    System.out.println("i and p contain the same value.");

出力は次のとおりです。

i and p are the same.
i and p contain the same value.

オブジェクト i と p は同じオブジェクトであるため、true に等しいことに注意することが重要です。比較は値に基づくのではなく、オブジェクトの等価性に基づいています。Integer i と p が -128 または 127 の範囲外の場合、キャッシュは使用されないため、新しいオブジェクトが作成されます。値の比較を行う場合は、常に「.equals」メソッドを使用してください。Integer をインスタンス化しても、このキャッシュは作成されないことに注意することも重要です。

「==」は常にオブジェクトの等価性に使用され、ボックス化されていない値を比較するためにオーバーロードされていないことに注意してください

于 2012-02-17T11:22:42.990 に答える
10

整数ラッパー オブジェクトは値 127 内でのみ同じインスタンスを共有しますか?を参照してください。. Integer クラスは、共通の値に対して共有静的インスタンスを保持します。

于 2012-02-17T11:15:43.910 に答える