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年間携わってきましたが、このケースを説明することはできません。
_==
_は参照を比較し、.equals()
は値を比較します。これら2つのLongはオブジェクトであるため、_==
_演算子を使用すると、オブジェクト参照が比較されます。
ただし、_Long id1 = 123L;
_のリテラル値_123L
_では、Long.valueOf(String)
を使用してLong
オブジェクトにオートボックス化され、内部ではこのプロセスがLongCacheを使用することに注意してくださいには_[-128,127]
_の範囲があり、123はこの範囲にあります。つまり、長いオブジェクトがキャッシュされ、これら2つは実際には同じオブジェクトです。
==
は参照値を比較し、より小さい 長い値はキャッシュされます
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値に対して機能します
また見なさい
_==
_を使用しているために4時間問題が発生しました... _Long < 128
_では比較は問題ありませんでしたが、より大きな値ではkoでした。
一般に、Objects
を比較するために_==
_を使用することはお勧めできません。可能な限り.equals()
を使用してください。プリミティブ用に_==, >, <, <= etc.
_を保持します。