31

2 つの Long 変数を比較しようとすると、非常に奇妙な問題が発生しました。それらは常に false と表示され、Eclipse でデバッグすることにより、それらが同じ数値であることを確認できます。

if (user.getId() == admin.getId()) {
    return true; // Always enter here
} else {
    return false;
}

上記の 2 つの戻り値はどちらもオブジェクト型の Long であり、混乱しました。そして、次のような main メソッドを書いたことを確認するには:

Long id1 = 123L;
Long id2 = 123L;

System.out.println(id1 == id2);

それは真実を印刷します。

それで、誰かが私にアイデアを与えることができますか?私は Java 開発で 3 年間働いていますが、このケースを説明することはできません。

4

3 に答える 3

51

==参照を.equals()比較し、値を比較します。==これら 2 つの Long はオブジェクトであるため、演算子を使用するとオブジェクト参照が比較されます。

ただし、Long id1 = 123L;リテラル値はを使用してオブジェクト123Lに自動ボックス化されることに注意してください。内部的に、このプロセスは範囲を持つ LongCache を使用し、123 はこの範囲内にあります。つまり、長いオブジェクトがキャッシュされ、これらの2 つは実際には同じオブジェクトです。LongLong.valueOf(String)[-128,127]

于 2013-10-21T03:32:29.793 に答える
8

==参照値を比較し、小さいlong 値がキャッシュされるため

 public static Long  valueOf(long l) {
     final int offset = 128;
     if (l >= -128 && l <= 127) { // will cache
         return LongCache.cache[(int)l + offset];
     }
     return new Long(l);
 }

したがって、より小さな long 値で機能します

こちらもご覧ください

于 2013-10-21T03:28:11.130 に答える