Назад к вопросам
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);
}