Большинство других комментариев уже дали вам ответ: вам нужно это сделать, потому что есть коллекции (например, 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
со свойствами, которые могут быть изменены (изменчивые), является действительно плохой идеей.