2012-09-22 14 views
28

I、次のコードを有する:比較整数オブジェクト

public class Test { 

    public static void main(String[] args) { 

     Integer alpha = new Integer(1); 
     Integer foo = new Integer(1); 

     if(alpha == foo) { 
      System.out.println("1. true"); 
     } 

     if(alpha.equals(foo)) { 
      System.out.println("2. true"); 
     } 

    } 

} 

出力は、以下のように:

2. true 

しかし例えば、異なる出力を生成するInteger objectintの種類を変更します。

public class Test { 

    public static void main(String[] args) { 

     Integer alpha = new Integer(1); 
     int foo = 1; 

     if(alpha == foo) { 
      System.out.println("1. true"); 
     } 

     if(alpha.equals(foo)) { 
      System.out.println("2. true"); 
     } 

    } 

} 

新しい出力:

1. true 
2. true 

これはどのようにすることができますか?なぜ最初のコード例の出力は1. trueではありませんか?

+5

本当に最初の出力は2ではありませんか?本当ですか?さもなければ、何も意味をなさない。 – ILMTitan

+0

はい、申し訳ありませんが、2を1に変更しました。 –

+2

可能な重複:[Javaで2つの整数を比較すると自動アンボックスが発生しますか?](http://stackoverflow.com/q/1514910/1164465) –

答えて

31

参照型の場合、==は参照が等しいかどうか、つまり参照が同じオブジェクトを指しているかどうかをチェックします。

プリミティブ型の場合、==は値が等しいかどうかをチェックします。

java.lang.Integerは参照型です。 intはプリミティブ型です。

編集:一方のオペランドがプリミティブ型のもので、他方が適切なプリミティブ型にアンボックスする参照型の他方である場合、==は参照ではなく値を比較します。

+0

ありがとう、これは私をクリアしました。質問と回答は –

+6

+1です。 '(Integer == int)'や '(int == Integer)'では '(Integer == Integer)'にオートボックスされない '(int == int)'には常にアンボックスされますか? – Pshemo

+0

@Pshemo:正しい。 – meriton

4

==オブジェクトの参照が同じであるかどうかを確認して、Integersに対してfalseを返す理由を確認します。しかし、基本的な型(ints、floats、...)では、それが等しいかどうかをチェックするので、あなたは本当のことになります。

Integerとintを比較する最初のケースでは、intがIntegerオブジェクト(オートボクシング)に変換され、参照の比較が行われることに言及する必要があります。それらは異なるので、falseを返します。

7

整数オブジェクトはオブジェクトです。これは論理的に聞こえるが、質問に対する答えである。オブジェクトはnewキーワードを使用してJavaで作成され、メモリに保存されます。比較するときは、オブジェクトの値/プロパティではなく、オブジェクトのメモリ位置を比較します。 .equals()メソッドを使用して

、あなたが実際にメモリにその場所、オブジェクトの値/プロパティを比較していない:new Integer(1).equals(new Integer(1))戻りtrueしばらく

new Integer(1) == new Integer(1)戻りfalseを、。


intは、Javaのプリミティブ型です。 intを作成すると、参照されるのはその値だけです。 Javaのプリミティブ型を比較す​​ると、メモリの場所ではなく値が比較されます。そのため、5 == 5は常にtrueを返します。

Integerオブジェクトをプリミティブ型と比較すると、オブジェクトは可能であればプリミティブ型にキャストされます。 Integerintでこれが可能であるため、比較されます。そのため、Integer(1).equals(1)がtrueを返します。

+0

+1明確な説明のために。 – HybrisFreelance

1

異なるので、間違っている参照よう== int型ここでは、オートボクシングはここに(その整数比較です前にintに変換される)ので、真の適用..しかし、整数==整数整数は比較オブジェクト..

0

まず例: オブジェクト間の==演算子を使用すると、参照の等価性がチェックされ、2つの異なるオブジェクトを比較しているため、等しくはありません。

第2の例: ラッパータイプ(Integer、Longなど)と数値タイプ(int、longなど)の間に==を使用すると、ラッパータイプはアンボックス化され、 2つの基本的な数値型(すなわち、intintの間)です。アンボックスはバイナリ数値プロモーションの一部です。http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2

1

new Integer(1)を使用して新しいオブジェクトを作成すると、同じ値を持っていても毎回全く異なるオブジェクトが作成されます。 '=='は、オブジェクトがデータ値ではなく同じかどうかをチェックします。あなたの場合、次のように値を確認できました:

if(alpha.intValue() == foo.intValue()) { 
// 
}