Вопрос проверяет знание правил корректного использования объектов в качестве ключей хеш-коллекций.
Ключи HashMap должны корректно реализовывать equals() и hashCode(). Они не должны изменяться после помещения в карту. Логическое равенство должно быть стабильным. Также важно, чтобы hashCode() был детерминированным и быстрым. Нарушение этих требований приводит к логическим ошибкам.
HashMap накладывает ряд неформальных, но критически важных требований к ключам.
Ключ обязан:
соблюдать контракт equals() / hashCode()
возвращать одинаковый hashCode() для равных объектов
обеспечивать логическое сравнение
Без этого HashMap теряет способность находить элементы.
После помещения в HashMap:
состояние ключа не должно меняться
поля, участвующие в equals() и hashCode(), должны быть стабильны
Изменение ключа делает его «потерянным» внутри карты.
hashCode() должен:
возвращать одинаковое значение при одинаковом состоянии
не зависеть от случайных факторов
не использовать изменяемые внешние данные
Хорошие кандидаты в ключи:
String
Integer
неизменяемые value-объекты
Плохие кандидаты:
объекты с сеттерами
объекты с изменяемыми коллекциями
даты без защитного копирования
Вывод: корректный ключ HashMap — это стабильный, логически сравнимый и неизменяемый объект.