Какая связь между методами hashCode() и equals()?



Согласно Oracle, существует следующее правило:



Если два объекта равны (т.е. метод equals() возвращает true), у них должен быть одинаковый хэш-код.



При этом не стоит забывать, что одинаковый хэш-код может быть у двух разных объектов.



Xтобы разобраться, почему же equals() и hashCode() переопределяют всегда в паре, рассмотрим следующие случаи:

Оба метода переопределенные.



В таком случае два разных объекта с одинаковыми внутренними состояниями будут возвращать при equals() — true, в то время как и hashCode() будет у обоих возвращать одно и то же число.



Получается, все окей, ибо правило выполняется.



Оба метода не переопределенные.



В таком случае два разных объекта с одинаковыми внутренними состояниями при equals() будут возвращать false, так как сравнение идёт по ссылке через оператор ==.



Метод hashCode() также вернет разные значения (скорее всего), так как он выдает преобразованное значение адреса ячейки памяти. Но у одного и того же объекта это значение будет одинаковым, как и equals() в данном случае вернет true, только когда ссылки указывают на один и тот же объект.



Получается, и в данном случае все окей и правило выполняется.



Переопределен equals(), не переопределен hashCode().



В таком случае для двух разных объектов с одинаковыми внутренними состояниями equals() будет возвращать true, а hashCode() будет возвращать (скорее всего) разные значения.



Происходит нарушение правила, поэтому так делать не рекомендуется.



Не переопределен equals(), переопределен hashCode().



В таком случае для двух разных объектов с одинаковыми внутренними состояниями equals() будет возвращать false, а hashCode() будет возвращать одинаковые значения.



Происходит нарушение правила, поэтому подход неверный.



Как вы видите, выполнение правила возможно лишь когда equals() и hashCode() переопределяются оба либо оба не переопределяются вовсе.



Подробнее об equals() и hashCode() читайте в данной статье.



@javatg