Большинство других комментариев уже дали вам ответ: вам нужно сделать это, потому что есть коллекции (то есть: HashSet, HashMap), которые используют hashCode в качестве оптимизации для «индексации» экземпляров объекта, и эти оптимизации ожидают, что если a.equals(b)
==> a.hashCode() == b.hashCode()
(учтите, что обратное не выполняется).
Но в качестве дополнительной информации вы можете выполнить это упражнение:
class Box {
private String value;
/* some boring setters and getters for value */
public int hashCode() { return value.hashCode(); }
public boolean equals(Object obj) {
if (obj != null && getClass().equals(obj.getClass()) {
return ((Box) obj).value.equals(value);
} else { return false; }
}
}
Сделайте это:
Set<Box> s = new HashSet<Box>();
Box b = new Box();
b.setValue("hello");
s.add(b);
s.contains(b); // TRUE
b.setValue("other");
s.contains(b); // FALSE
s.iterator().next() == b // TRUE!!! b is in s but contains(b) returns false
Из этого примера вы узнаете, что реализация equals
или hashCode
со свойствами, которые можно изменить (изменить), - это действительно плохая идея.