Контракт hashCode()
и equals()
в Java:
- Контракт
equals()
:- Рефлексивность: для любого объекта
x
,x.equals(x)
должно возвращатьtrue
. - Симметричность: для любых объектов
x
иy
, еслиx.equals(y)
возвращаетtrue
, то иy.equals(x)
должно вернутьtrue
. - Транзитивность: если
x.equals(y)
иy.equals(z)
, тоx.equals(z)
тоже должно вернутьtrue
. - Согласованность: многократные вызовы
x.equals(y)
должны возвращать одинаковый результат, если объекты не изменились. - Для любого объекта
x
,x.equals(null)
должно возвращатьfalse
.
- Рефлексивность: для любого объекта
- Контракт
hashCode()
:- Если два объекта равны (по
equals()
), они должны иметь одинаковый хэш-код. - Если два объекта не равны, их хэш-коды могут быть одинаковыми, но это нежелательно (стремитесь к минимальному числу коллизий).
- Если два объекта равны (по
Как переопределять:
equals()
: Следует сравнивать только те поля, которые действительно участвуют в логике определения «равенства» объектов.hashCode()
: Следует учитывать те же поля, что и вequals()
. Можно использовать стандартные утилиты вродеObjects.hash()
.
Где используются hashCode()
и equals()
:
- В хэш-коллекциях (например,
HashMap
,HashSet
):hashCode()
используется для быстрого поиска корзины, аequals()
— для точного сравнения объектов. - При проверке равенства объектов для бизнес-логики или тестов.
Правильное переопределение этих методов гарантирует корректное поведение при работе с коллекциями и логикой сравнения объектов.