hashCode() и equals(). Какой у них контракт? Как нужно их переопределять? Где они используются и как?

Контракт hashCode() и equals() в Java:

  1. Контракт 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.
  2. Контракт hashCode():
    • Если два объекта равны (по equals()), они должны иметь одинаковый хэш-код.
    • Если два объекта не равны, их хэш-коды могут быть одинаковыми, но это нежелательно (стремитесь к минимальному числу коллизий).

Как переопределять:

  • equals(): Следует сравнивать только те поля, которые действительно участвуют в логике определения «равенства» объектов.
  • hashCode(): Следует учитывать те же поля, что и в equals(). Можно использовать стандартные утилиты вроде Objects.hash().

Где используются hashCode() и equals():

  • В хэш-коллекциях (например, HashMap, HashSet): hashCode() используется для быстрого поиска корзины, а equals() — для точного сравнения объектов.
  • При проверке равенства объектов для бизнес-логики или тестов.

Правильное переопределение этих методов гарантирует корректное поведение при работе с коллекциями и логикой сравнения объектов.


Опубликовано

в

от

Метки: