8

重複の可能性:
Integer == int は Java で許可されています

次の2つのステートメントの違いは何ですか

Long l1 = 2L;
if(l1 == 2)
    System.out.println("EQUAL");                         
if(l1.longValue() == 2)
    System.out.println("EQUAL");

どちらも同じ結果「EQUAL」を与えています。しかし、私の疑問は、ロングがオブジェクトです。どのように等しいですか?

4

2 に答える 2

11

コメントですでに指摘したように、

if(l1 == 2)

Long l1プリミティブ型に自動的に箱から出されますlong。したがって、比較はとの間longですint

2番目のケースでは、はオブジェクトによって表される値をプリミティブとしてl1.longValue()返すため、との間で再度比較が行われます。あなたのコメントに答えて、プリミティブ型とラッパークラスの主な違いは何ですか?を見てください。longLongLonglongint

オートボクシングについてのコメントで与えられたリンクは、この主題を非常にうまくカバーしています。

于 2013-02-01T08:48:30.803 に答える
-1

この動作は、拡大とボックス化によって説明されます。

最初の例では、

if(l1 == 2)

何が起こるかは次のとおりです。

1: コンパイラは、ラッパー (Long) とプリミティブ値 (int) を比較していることに気づき、プリミティブをボックス化して、次のようにします。

if (l1 == new Integer(2))

2 は int であるため (最後に「L」がありません)。

2: コンパイラは、Long と Integer を比較していることに気づき、Integer を Long に拡張して、次のようにします。

if (l1 == new Long(new Integer(2))

3: 2 つの Long を比較しています。

もう 1 つのケースはより単純で、結果は次のようになります。

もし (2L == 2)

プリミティブ値を比較します。これは、型が異なっていても許可されます。

于 2013-02-01T09:07:57.870 に答える