Reputation: 1405
I got a very strange problem when I'm trying to compare 2 Long variables, they always show false and I can be sure they have the same number value by debugging in Eclipse:
if (user.getId() == admin.getId()) {
return true; // Always enter here
} else {
return false;
}
Both of above 2 return values are object-type Long, which confused me. And to verify that I wrote a main method like this:
Long id1 = 123L;
Long id2 = 123L;
System.out.println(id1 == id2);
It prints true.
So can somebody give me ideas?. I've been working in Java Development for 3 years but cannot explain this case.
Upvotes: 35
Views: 47890
Reputation: 3191
==
compares references, .equals()
compares values. These two Longs are objects, therefore object references are compared when using ==
operator.
However, note that in Long id1 = 123L;
literal value 123L
will be auto-boxed into a Long
object using Long.valueOf(String)
, and internally, this process will use a LongCache which has a [-128,127]
range, and 123 is in this range, which means, that the long object is cached, and these two are actually the same objects.
Upvotes: 58
Reputation: 1177
Stuck on an issue for 4 hours because of the use of ==
... The comparison was ok on Long < 128
but ko on greater values.
Generally it's not a good idea to use ==
to compare Objects
, use .equals()
as much as possible ! Keep ==, >, <, <= etc.
for primitives.
Upvotes: 4
Reputation: 240976
because ==
compares reference value, and smaller long values are cached
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);
}
so it works for smaller long values
Also See
Upvotes: 10