Page 3 of 7
public class Person {
private String name;
private Date birth;
public boolean equals(Object other) {
if (other == this) return true;
if (other == null) return false;
if (getClass() != other.getClass()) return false;
Person person = (Person)other;
return (
(name == person.name ||
(name != null && name.equals(person.name))) &&
(birth == person.birth ||
(birth != null && birth.equals(person.birth)))
);
}
}
In this case, the identity check (name == person.name) captures whether both references are null. It also removes the equality test when the two fields are identical, thus not requiring a recursive call to equals() in the other instance.
Note: It is possible to ignore the test for null in the second part if you know the value can never be null; i.e., it is assigned non-null in the constructor. However, it is better to be safe than have numerous NullPointerExceptions coming out of datastructures because your equals() method does not handle null data correctly.
A similar implementation holds for other reference types, such as arrays. However, since arrays lack an equals() implementation, you either have to write the for loop manually to test for element equality or use the Arrays class to perform the equality check (see Resources for link to the Javadoc).
The hash code allows collections such as HashMap to organize and access data quicker than searching through the entire datastructure. It does this by partitioning the data
into different buckets, then searching through the single bucket corresponding to the hash code required. As a result, if an object's hash code
differs, it won't be searched; just like you wouldn't expect the word "Banana" to appear in a dictionary's "A" section. Figure
2 shows a simplified example of how a hash table is structured, using initial letters as the hash:

Figure 2. Simplified example of how a hash table works
The hash code is just an int calculated from the instance data. Importantly, if two instances are considered equal by equals(), then they must have the same hash code. As a consequence, the hash code can only be computed on those fields compared in the equals() method. It does not have to use all of the equality fields:
public class Point {
private int x, y;
public boolean equals(Object other) {
...
Point point = (Point)other;
return (x == point.x && y == point.y);
}
public int hashCode() {
return x;
}
}
The code above is a correct (if not optimal) implementation of hashCode(), since it only relies on fields compared by the equals() method. In this case, all points that have the same x value have the same hash code and are deposited into the same bucket for hash comparisons. Thus, when searching for a point
in a Map, only the Points with the same x value will be compared.
Of course, it is desirable for hash codes to be distributed, which means that where possible, two different objects should have different hash codes. Additionally, if two objects are "close" to each other, they should have a very different hash code.
| Subject |
|
|
|
( 1 2 all )
|
|
|
|
|
|
|
|
|
|
|
When you need to compare objects Wich has specific rules for exaBy Anonymous on October 14, 2009, 2:09 pmWhen you need to compare objects Wich has specific rules for example.
Reply | Read entire comment
When to overwrite equals() and hashCode()By Anonymous on July 7, 2009, 3:08 amCan any pls tell in which case we have to overwrite equals() and hashCode()
Reply | Read entire comment
View all comments