Вопрос проверяет понимание контракта equals/hashCode и его критической роли в корректной работе хеш-коллекций.
При нарушении контракта equals/hashCode HashMap начинает работать некорректно.
Объект может не находиться в карте, даже если он там есть.
Возможны дубликаты ключей, которые логически считаются равными.
Операции get, containsKey, remove могут возвращать неожиданные результаты.
Это одна из самых частых и опасных ошибок при работе с коллекциями.
Чтобы понять последствия, сначала важно напомнить сам контракт.
equals/hashCodeОпределение:
Контракт требует, чтобы:
Если a.equals(b) == true, то a.hashCode() == b.hashCode().
hashCode() был стабильным, пока объект используется как ключ.
equals() был рефлексивным, симметричным и транзитивным.
Перед перечислением последствий важно понимать, что HashMap доверяет этим методам.
equals() переопределен, hashCode() — нетПоследствия:
Равные объекты попадают в разные корзины.
Поиск по ключу перестает работать.
get() возвращает null.
hashCode() зависит от изменяемых полейЕсли поле ключа меняется после вставки:
Хеш-код меняется.
Ключ оказывается в «чужой» корзине.
Найти или удалить его невозможно.
hashCode() одинаковый, но equals() всегда falseПоследствия:
Все ключи попадают в одну корзину.
Производительность резко падает.
Карта работает почти как список.
Ошибки:
не вызывают исключений
проявляются не сразу
сложно отлаживаются
Нарушение контракта equals/hashCode ломает логику HashMap, поэтому ключи должны быть неизменяемыми и корректно реализовывать оба метода.