web-dev-qa-db-ja.com

Javaで比較するために、2つのLong変数が==演算子と等しくないものは何ですか?

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

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

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

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

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

それは本当を印刷します。

だから誰かが私にアイデアを与えることができますか?私はJava開発に3年間携わってきましたが、このケースを説明することはできません。

20
Brady Zhu

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

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

33
BlackJoker

==は参照値を比較し、より小さい 長い値はキャッシュされます

 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値に対して機能します

また見なさい

8
Jigar Joshi

_==_を使用しているために4時間問題が発生しました... _Long < 128_では比較は問題ありませんでしたが、より大きな値ではkoでした。

一般に、Objectsを比較するために_==_を使用することはお勧めできません。可能な限り.equals()を使用してください。プリミティブ用に_==, >, <, <= etc._を保持します。

1
Thibault