Проверяет понимание контракта hashCode()/equals() и рисков при мутабельных ключах.
Нежелательно. Если поля, участвующие в hashCode() или equals(), изменяются после помещения в HashMap, объект «потеряется» в корзинах: поиск по старому хешу не найдёт его в новом состоянии.
Контракт HashMap:
При добавлении ключа вычисляется hashCode(), выбирается «корзина», затем в ней сравниваются ключи через equals().
Проблема мутации:
После изменения полей hashCode() может давать другое значение, и запись окажется в несоответствующей корзине.
Дальнейшие вызовы get(key) возвращают null, хотя объект есть.
Пример:
class Person {
String name;
// hashCode() и equals() основаны на name
}
Map<Person, Integer> map = new HashMap<>();
Person p = new Person("Alice");
map.put(p, 1);
p.setName("Bob");
map.get(p); // null, потому что hashCode изменилсяРекомендации:
Использовать для ключей только иммутабельные объекты.
Если нужно мутабельное состояние, не включать эти поля в hashCode()/equals().
Либо копировать объект перед использованием в качестве ключа.