1

重複の可能性:
Javaで==演算子を使用してラッパーオブジェクトを比較する

javaバージョン1.6.0_26

SCJP試験準備のための本から:

メモリを節約するために、次の2つのインスタンス[-128と127からの短い整数、およびその他のいくつかのインスタンスですが、質問には関係ありません]ラッパーオブジェクト(boixngを介して作成)は、プリミティブ値が同じ。

私がしたこと:

次のように、-128から127までの2つの整数を比較するとします。

1. Integer i1 = 10;
2. Integer i2 = 10;
3. System.out.println(i1 == i2); // true

しかし、なぜ同じことが私たちに「偽」を与えるのか、それとも同じではないのかもしれません:

4. Integer i3 = new Integer(10);
5. Integer i4 = new Integer(10);
6. System.out.println(i3 == i4); // false

私の質問:

1)コードの1行目に、暗黙のボクシングを作成しますか?

2)コードの3行目と6行目で異なる結果が得られるのはなぜですか?

4

4 に答える 4

8

コードの1行目に、暗黙のボクシングを作成しますか?

Yes

2)コードの3行目と6行目で異なる結果が得られるのはなぜですか?

Integer.valueOf(int)-128から127までのすべての値をプールします。

その理由は、小さな整数値が頻繁に使用され、オブジェクトが必要になるたびにそのようなすべての値に対して新しいオブジェクトを作成しても意味がないためです。したがって、これらは「インターン」オブジェクトとして作成され、そのような整数値へのすべての参照は同じメモリアドレスを指します。

Integer.javaのコードスニペット:

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

代わりに、を呼び出すとnew Integer(10);、まったく新しいオブジェクトが作成されるため、同じ整数値を持つ2つの異なるオブジェクトが異なるメモリアドレスを指します。

于 2012-12-27T06:30:14.193 に答える
3
1) Does on the 1st line of code we make implicit boxing?

はい。その呼ばれる自動ボクシング

2) Why the 3rd and 6th lines of code give us different results?

==は、2つの変数がまったく同じ値を持っているかどうかを実際にチェックします。プリミティブ変数には表示されているものが含まれていますが、参照変数にはそれが保持するオブジェクトへのアドレスが含まれていることに注意してください。

==を使用してプリミティブをラッパーと比較すると、ラッパーがアンラップされ、比較がプリミティブからプリミティブになります。したがって、オブジェクトの比較ではなくプリミティブの比較であるため、常にtrueになります。だから

System.out.println(i1 == i2);

本当になります。

しかし、6行目です。

System.out.println(i3 == i4);

オブジェクトが同じ参照を持っていない限り、2つのオブジェクトを比較していますが、それは真実ではありません。.equalsメソッドを使用すると、trueを取得できます。試す

System.out.println(i3.equals(i4));
于 2012-12-27T06:29:16.920 に答える
1

最初の例では、コンパイラーはボックス化を使用して変数を割り当てています。この場合、i1 / i2は定数です(静的なfinalオブジェクトに少し似ています)。

2番目の例では、整数の2つのインスタンスを作成するため、それらが同じになることはありません。

于 2012-12-27T06:27:26.733 に答える
0

6行目は、参照i3i4同じオブジェクトを指しているかどうかを比較しているため、falseを示しています。この場合はそうではありません。したがって、false

ラッパーとプリミティブの両方が関係している場合、オートボクシングとアンボクシングが思い浮かびます。ここでは、とは両方ともi3ラッパーi4オブジェクトであるため、他のオブジェクトと同様に扱われます。POJO

AutoBoxingは、ラッパーオブジェクトとプリミティブの両方が関係している場合にのみ発生します。

例えば

int primitive = 10;
Integer wrapper = new Integer(10);
System.out.println(primitive == wrapper); //true

上記True==比較では、プリミティブの値がラッパーの状態と比較されます。

于 2012-12-27T06:29:30.140 に答える