36
class datatype1
{

    public static void main(String args[])
    {
    int i1 = 1;
    Integer i2 = 1;
    Integer i3 = new Integer(1);

    System.out.println("i1 == i2"+(i1==i2));
    System.out.println("i1 == i3"+(i1==i3));
    System.out.println("i2 == i3"+(i2==i3));
}

}

出力

i1 == i2true
i1 == i3true
i2 == i3false

i2 と i3 を比較すると false になる理由を誰かが説明できますか?

4

2 に答える 2

13
Integer i2 = 1;

この結果はオートボクシングです。int(プリミティブ型) を対応するラッパーに変換しています。

 Integer i3 = new Integer(1);

ここでは、整数オブジェクトを直接作成しているため、オートボクシングは必要ありません。

i1 == i2
i1 == i3

i2 と i3 は自動的にアンボックス化され、通常の int 比較が行われるため、true になります。

今考えます

i2 == i3

ここで、i2 と i3 は両方とも、比較する整数オブジェクトです。どちらも異なるオブジェクトであるため (new 演算子を使用したため)、明らかに false になります。注意 == 演算子は、2 つの参照が同じオブジェクトを指しているかどうかをチェックします。実際、オーバーライドされていない場合、 . equals() メソッドは同じことを行います。

と言っているのと同じです

    Integer i2 = new Integer(1);
    Integer i3 = new Integer(1);
    System.out.println("i2 == i3 "+(i2==i3));

これは再び false になります。

于 2013-08-26T13:32:28.633 に答える