Контракт 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()— для точного сравнения объектов. - При проверке равенства объектов для бизнес-логики или тестов.
Правильное переопределение этих методов гарантирует корректное поведение при работе с коллекциями и логикой сравнения объектов.