Integerオブジェクトと一定の値を比較すると、Javaは値をボックスまたはIntegerオブジェクトをUnboxのでしょうか?
「==」、私が読んだものに基づいて、したがって、それはJavaのボックスが定数は、オブジェクト間の参照比較を実行すると仮定する唯一の論理的だ、参考比較です。しかし、テストコードの下矛盾する結果が得られているように見えます。
Integer v1 = 1000;
Integer v2 = 1000;
boolean b1 = v1 == 1000; //True.
boolean b2 = v1 == v2; //False. Proof that 1000 boxes to new object and is not fetched from cache.
それでは、どのように使用して一定の値を比較対オブジェクト行い==
、Javaの作品は?オペレータは、この場合には値で比較していますか?
あなたが「一定の値」と呼ぶことでint
、その型があるので、リテラルint
。
JLS 15.21.1は言います:
等価演算子のオペランドが数値型の両方であり、または1つが数値型であり、他方が数値型の(5.1.8)変換可能である場合、バイナリ数値昇格は、オペランドに対して実行されます。
あなたにはv1 == 1000
、テスト、1000
数値型で、v1
二項数値昇格が行なわれるので、数値型に変換可能です。
JLS 5.6.2(バイナリ数値昇格は)言います:
任意のオペランドが参照型である場合、それがアンボクシング変換され
したがって、Integer
オペランドは、 - v1
-とアンボックス化であるint
二つの比較int
sが行われます。したがって、比較の結果がありますtrue
。
次の2つの参照型を比較すると- v1 == v2
-何のアンボクシングはで書かれたように、参照のみが比較され、場所を取りませんJLS 15.21.3:
等価演算子のオペランドが参照型またはnull型のいずれの両方である場合、動作は、オブジェクト等価です。
以来1000
大きすぎることでキャッシュするInteger
キャッシュ、b1
およびb2
同じインスタンスを参照していないので、比較の結果がありますfalse
。