2012-02-17 5 views
8

可能性の重複のために:私はIntegerオブジェクトに対して次の==動作を発見したと私はそれを理解できない
Inconsistent behavior on java's ==
Integer wrapper objects share the same instances only within the value 127?Javaの==整数

。 1000ではなく、10

前者期待どおりに動作==、短い上

(...私はこのような比較のために等しい1を使用する必要があることは十分承知していますが、私はOCPJPのために勉強しています)

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 

誰かが説明していただけますか?

+1

を比較するために、オーバーロードされていないことに注意してください:+ AggressiveOpts'と最初の1のように、第二のように動作しますIntegerキャッシュのサイズが大きくなります。 ;) –

答えて

11

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

Integer myNumber = 10 

又は

Integer myNumber = Integer.valueOf(10); 

256 Integerオブジェクトは、すべての整数アレイに格納される127 -128の範囲に作成されます。例えば、次のコードでは、キャッシュが作成されます。このキャッシング機能は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. 

彼らは同じオブジェクトであるため、私とpは唯一の真に等しいそのオブジェクトを注意することが重要であり、比較ではありませんその値に基づいて、オブジェクトの平等に基づいています。 Integer iとpが-128または127の範囲外の場合、キャッシュは使用されないため、新しいオブジェクトが作成されます。値の比較を行うときは、常に ".equals"メソッドを使用します。 Integerをインスタンス化してもこのキャッシュは作成されないことに注意することも重要です。

ところで-XX `を試してみてください常にオブジェクトの平等のために使用されている「==」、それはアンボクシングの値