Вопрос проверяет понимание контракта equals() / hashCode() и его влияния на работу хеш-коллекций.
Если equals() переопределён, а hashCode() — нет, контракт между ними нарушается. Объекты, которые считаются равными, могут иметь разные hashCode(). В хеш-коллекциях такие объекты будут вести себя некорректно. Например, объект может не находиться в HashMap, хотя он там есть. Это приводит к трудноуловимым ошибкам.
Контракт equals() и hashCode() напрямую влияет на корректность работы HashMap и HashSet.
HashMap работает в два шага:
Вычисляет hashCode() ключа и определяет bucket
Внутри bucket сравнивает ключи через equals()
Если hashCode() не согласован с equals(), первый шаг ломается.
Рассмотрим ситуацию:
два объекта логически равны (equals() == true)
hashCode() у них разный (унаследован от Object)
Результат:
объекты попадают в разные bucket’ы
HashMap не вызывает equals()
поиск и удаление не работают
Пример сценария:
map.put(user1, "value");
// позже
map.get(user2); // null, хотя equals(user1, user2) == true
HashMap
HashSet
ConcurrentHashMap
любые структуры на основе хеширования
Такая ошибка:
не вызывает исключений
проявляется только в runtime
сложно диагностируется
Вывод: если переопределяется equals(), hashCode() обязан быть переопределён всегда.