Встречается на собеседованиях • сегодня

Каков контракт между методами hashCode() и equals() в Java

Контракт между hashCode() и equals() в Java состоит из трех правил:

  1. Согласованность: если два объекта равны по equals(), их hashCode() должен возвращать одинаковое значение.
  2. Обратное необязательно: разные объекты могут иметь одинаковый hashCode(), даже если они не равны по equals().
  3. Неизменность: hashCode() должен возвращать одно и то же значение, если объект не изменялся (если поля, участвующие в equals(), не менялись).

Пример нарушения контракта:

java
class Person {
    String name;
    
    @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(name, person.name);
    }
    
    // Нет переопределения hashCode() - нарушение!
}

При использовании в HashSet или HashMap это приведет к некорректной работе. Правильная реализация:

java
@Override
public int hashCode() {
    return Objects.hash(name);
}
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы