オブジェクトと一定の値を比較するときにJavaでは、「==」ボックスまたはVHS版のでしょうか?

アムリッシュ・クマール:

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二つの比較intsが行われます。したがって、比較の結果がありますtrue

次の2つの参照型を比較すると- v1 == v2-何のアンボクシングはで書かれたように、参照のみが比較され、場所を取りませんJLS 15.21.3

等価演算子のオペランドが参照型またはnull型のいずれの両方である場合、動作は、オブジェクト等価です。

以来1000大きすぎることでキャッシュするIntegerキャッシュ、b1およびb2同じインスタンスを参照していないので、比較の結果がありますfalse

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=23312&siteId=1