15

それで、私は今日この質問をされました。

Integer a = 3;
Integer b = 2;
Integer c = 5;
Integer d = a + b;
System.out.println(c == d);

このプログラムは何を印刷しますか?trueを返します。私は、自動(および自動解除)ボクシングをどのように理解したかにより、常にfalseと出力されると答えました。Integer a = 3を割り当てると、新しいInteger(3)が作成され、a==がプリミティブ値ではなく参照を評価するという印象を受けました。

誰かがこれを説明できますか?

4

4 に答える 4

20

-128〜127のボックス化された値がキャッシュされます。ボクシングはInteger.valueOfキャッシュを使用するメソッドを使用します。範囲外の値はキャッシュされず、常に新しいインスタンスとして作成されます。値はキャッシュされた範囲に含まれるため、==演算子を使用すると値は等しくなります。

Java言語仕様からの引用:

ボックス化されている値pがtrue、false、バイト、\u0000から\u007fの範囲の文字、または-128から127までの整数または短い数値の場合、r1とr2を任意の2つのボックス変換の結果とします。 pの。r1==r2の場合は常にそうです。

http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7

于 2010-01-07T15:33:01.973 に答える
11

これが実際に起こっていることです:

Integer c = Integer.valueOf(5);
Integer d = Integer.valueOf(a.intValue() + b.intValue());

Javaは、Integer-128〜127のオブジェクトのキャッシュを維持します。以下と比較してください。

Integer a = 300;
Integer b = 200;
Integer c = 500;
Integer d = a + b;
System.out.println(c == d);

どちらを印刷する必要がありますfalse

于 2010-01-07T15:34:48.660 に答える
5

これは、(自動ボックス化された)整数の一部がキャッシュされているため、実際に同じ参照を比較しているためです。この投稿には、より詳細な例と説明があります。

于 2010-01-07T15:36:29.487 に答える
4

キャッシングはオートボクシングの外部でも発生します。これを考慮してください。

Integer a = 1;
Integer b = new Integer(1);
Integer c = Integer.valueOf(1);

System.out.println(a == b);
System.out.println(b == c);
System.out.println(c == a);

これは印刷されます:

false
false
true

したがって、オブジェクトを比較するときは、一般的に「==」から離れたいと思います。

于 2010-01-07T15:50:37.740 に答える