A fundamental aspect of any Java class is its definition of equality.
It is determined by a class's
equals method and there are a couple of things to be considered for a correct implementation. Let's check 'em out so we get it right!
Note that implementing
equals always means that
hashCode has to be implemented as well! We'll cover that in a separate article so make sure to read it after this one.
Identity Versus Equality
Have a look at this piece of code:
String some = "some string"; String other = "other string";
We have two strings and they are obviously different.
What about these two?
String some = "some string"; String other = some; boolean identical = some == other;
Here we have only one String instance and
other both reference it.
In Java we say
other are identical and, accordingly,
What about this one?
String some = "some string"; String other = "some string"; boolean identical = some == other;
other point to different instances and are no longer identical, so
identical is false.
(We'll ignore String interning in this article; if this bugs you, assume every string literal were wrapped in a
But they do have some relationship as they both "have the same value".
In Java terms, they are equal, which is checked with
String some = "some string"; String other = "some string"; boolean equal = some.equals(other);
A variable's Identity (also called Reference Equality) is defined by the reference it holds.
If two variables hold the same reference they are identical.
This is checked with
A variable's Equality is defined by the value it references.
If two variables reference the same value, they are equal.
This is checked with
But what does "the same value" mean? It is, in fact, the implementation of
equals that determines "sameness". The
equals method is defined in
Object and since all classes inherit from it, all have that method.
The implementation in
Object checks identity (note that identical variables are equal as well), but many classes override it with something more suitable.
For strings, for example, it compares the character sequence and for dates it makes sure that both point to the same day.
Many data structures, most notably Java's own collection framework, use
equals to check whether they contain an element.
List<String> list = Arrays.asList("a", "b", "c"); boolean contains = list.contains("b");
true because, while the instances of
"b" are not identical, they are equal.
(This is also the point where
hashCode comes into play.)
Continue reading %How to Implement Java’s equals Method Correctly%