Why are 2 Long variables not equal with == operator in Java?

Brady Zhu picture Brady Zhu · Oct 21, 2013 · Viewed 30.2k times · Source

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.

Answer

BlackJoker picture BlackJoker · Oct 21, 2013

== 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.