2017-08-01 22 views
-8

パブリッククラスのテストをMEEするために教えてください{//名前 "テスト"このコードの出力は何ですか、なぜですか?

static public void main(String[] args) 
{ 
    Long a=111L; //declaring Long type variable 
    Long b=111L; //declaring Long type variable 
    Long c=222L; //declaring Long type variable 
    Long d=222L; //declaring Long type variable 
    System.out.println((a==b)+" "+(c==d)); /*output is "true false". I dont know Why? Please explain */ 
} 

と宣言クラス}

+2

あなたはオブジェクトを比較する方法ではない、ということはご存知でしょうか? –

+0

具体的な質問がありますか?混乱する箇所はありますか?コード自体は非常に基本的なものであり、いくつかのオブジェクトを比較し、比較結果を出力します。 – Zabuza

+0

[.equals()と==演算子で2つのオブジェクトを比較する](https://stackoverflow.com/questions/13387742/compare-two-objects-with-equals-and-operator) – jmoerdyk

答えて

4

Longは、プリミティブlong程度箱入りのラッパーです。 longを使用してください。 プリミティブは==と比較されますが、LongのようなオブジェクトはaLong.equals(otherLong)と比較されます。それ以外の場合は、==と比較すると、参照の等価性が比較されます。 source

-128〜127がキャッシュされているので、Sourceが真であると思われる理由があります。したがって、値が111LのLongオブジェクトはすべて同じオブジェクトになりますが、値が222LのLongは値が222Lの別のLongと異なります。

この不確実性のため、特に正確に同じオブジェクトであるかどうかを知りたい場合を除いて、オブジェクトは常に.equalsと比較する必要があります。

しかし、この場合、プリミティブを使用して、あなたと同じように比較することをお勧めします。値111と

+1

私は、あなたが1)「equals」と「==」の問題と2)autoboxing **を説明したところで、いくつかの答えにリンクすることで答えを改善できると思います。 – Zabuza

+1

@ザブザ – Novaterata

0

Java caches the wrapper class(Long) objects instances from the range -128 to 127

ロング変数(キャッシュ)、同じオブジェクト・インスタンスは、すべての参照が指すであろう。 (N個の変数、1つのインスタンス)

値が222(キャッシュされていない)のロング変数の場合、参照ごとにオブジェクトインスタンスがポイントされます。 (N個の変数、N個のインスタンス)

関連する問題