2012-08-14 7 views
6

私はLong秒で「==」演算子をテストしたいと、これは私が見つけたものです:次のコード:この奇妙なJavaの動作の原因は何ですか?

public static void main(final String[] args) { 
    final Long n = 0L; 
    final Long m = 0L; 
    System.out.println(n + " == " + m + " : " + (n == m)); 

    final Long a = 127L; 
    final Long b = 127L; 
    System.out.println(a + " == " + b + " : " + (a == b)); 

    final Long A = 128L; 
    final Long B = 128L; 
    System.out.println(A + " == " + B + " : " + (A == B)); 

    final Long x = -128L; 
    final Long y = -128L; 
    System.out.println(x + " == " + y + " : " + (x == y)); 

    final Long X = -129L; 
    final Long Y = -129L; 
    System.out.println(X + " == " + Y + " : " + (X == Y)); 
} 

出力:

0 == 0 : true 
127 == 127 : true 
128 == 128 : false 
-128 == -128 : true 
-129 == -129 : false 

私が来ることができる唯一の説明をJVMはすべてlongの値をPerm空間の[-128, 127]に格納し、そのアドレスをLongに指定し、上記の範囲外のものはすべて、コード内の各静的値に対して新しい割り当てを作成します。

私は右に近いですか?どのような状況で同様の行動に気づく必要がありますか?

PS。私はnullのチェックをしてから.equals()を使ってオブジェクトを比較すべきだと知っていますが、誰かが答えを知っていれば私は不思議でした。

EDIT

私にキーワードオートボクシングを与えたjtahlbornの答えの後、私はこれは、オートボクシングの結果であるwell-documented answer

+5

はい、正しくあります。 (そして、はい。 '.equals'の代わりに' == 'を使うのは罪です。) –

+1

http://stackoverflow.com/questions/11955958/with-abstract-datatypes-different-results-for-the-same-条件の種類/ 11955984#11955984 – kosa

+0

ヌルチェックを使用しないでください。ヌルチェックは悪です。ちょうどNULLを使用しないでください。 –

答えて

1

-128 to +127comparing object referencesの場合は、==オペレータを使用して評価されます。 Long値(-128から+127まで)はキャッシュに入れられ、複数回返されますが、上位と下位の数値は毎回new Longを生成します。

これはプリミティブラッパークラスInteger, Floatにも対応しています。 IntegerとFloatを試してみてください。あなたは、常に値に等しいため、同じオブジェクトを受け取るLong方法や、この期間中にオートボクシングLong.valueOf(long)によりを作成する場合

+1

ダウン投票者は説明が必要です! –

+1

私はdownvoterではないが、私はそれがどのようにexpalanationを少し必要と感じる-128 t0 127は本当ですか? – kosa

+0

ダウン投票者の回答が更新されました.. –

3

Longは-128から127までの値の内部キャッシュを持っています。だからこそ、あなたの例では、「==」は0,127、-128のために働いています。

Longを[-128、127]の外側に作成すると、Longオブジェクトの場合、常に新しいインスタンスが作成されます。 そのため、 '=='は128と-129では機能しません。

Long.valueOf(long)ソースコードを見てください。

関連する問題