ボックス化されたプリミティブと等価性
-
19-09-2019 - |
質問
そこで今日はこんな質問をさせていただきました。
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) が作成され、== がプリミティブ値ではなく参照を評価するという印象を受けました。
誰かこれを説明できますか?
解決
箱入り値がキャッシュされています。ボクシングは、キャッシュを使用しInteger.valueOf
メソッドを使用します。範囲外の値はキャッシュされ、常に新しいインスタンスとして作成されていません。あなたの値は、キャッシュされた範囲に落ちるので、値は==演算子を使用して同じである。
Java言語仕様からの引用:
箱詰めされた値pが真である場合には、 偽、バイト、範囲のchar \ u0000のはu007f \、またはするの intまたは短いです -128から127までの数、そしてましょう R1及びR2は、任意の2つの結果であります Pのボクシング変換。いつものこと 場合そのR1 == R2 の
ます。http:// docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7する
他のヒント
これは本当に何が起こっているかです。
Integer c = Integer.valueOf(5);
Integer d = Integer.valueOf(a.intValue() + b.intValue());
Javaは-128から127以下で比較間Integer
オブジェクトのキャッシュを保持します:
Integer a = 300;
Integer b = 200;
Integer c = 500;
Integer d = a + b;
System.out.println(c == d);
false
を印刷する必要があります。
これは、(自動ボックス化された) 整数の一部がキャッシュされているため、実際には同じ参照を比較していることになります。 この郵便受け より詳細な例と説明があります。
キャッシュがあまりにもオートボクシングの外で起こり、このことを考慮します:
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
オブジェクトを比較するときだから私は、一般的にあなたが離れて「==」から滞在したいと思います。