Эти два метода придуманы для использования в Java Collections Framework и связаны общим контрактом, для соблюдения которого переопределять их необходимо вместе. Методы обязательно нужно переопределить чтобы эффективно использовать экземпляры как ключи в
HashMap или
HashSet.
HashMap работает тем эффективнее, чем «лучше»
распределение хэшей.
Контракт:
1. Если объекты
equals, у них должны быть одинаковые
hashCode (не обязательно наоборот – коллизии допустимы!)
2.
equals должен быть
отношением эквивалентности3. Ничто не может быть
equals(null)4.
equals и
hashCode должны возвращать одни и те же значения для одного и того же объекта при каждом последующем вызове, даже если состояние объекта изменилось. Это делает реализацию для изменяемых (mutable) объектов
крайне сложной.
По умолчанию
equals сравнивает на
==. С умолчательным
hashCode дела обстоят интереснее: он зависит от реализации JVM, и может быть неожиданным.
Например в OpenJDK 7 это случайное число.
Подробная инструкция по переопределению этих методов описана в
Effective Java Item 9 (больше деталей о волшебном числе 31
здесь).