Sobes.tech
Назад к вопросам
Senior
3

Расскажите про equals и hashCode: контракт, зачем нужен hashCode

Компании, где спрашивали
cdti

Ответ от нейросети

sobes.tech AI

В Java контракт между методами equals() и hashCode() следующий:

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

Зачем нужен hashCode:

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

Если не переопределить hashCode вместе с equals, то объекты, которые считаются равными, могут иметь разные хэш-коды, что нарушит работу коллекций и приведёт к ошибкам.

Пример:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Person person = (Person) o;
    return Objects.equals(id, person.id);
}

@Override
public int hashCode() {
    return Objects.hash(id);
}