Какая связь между методами 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
Согласно 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