class User { String name; public int hashCode() { return name.hashCode(); } public boolean equals(Object o) { return o instanceof User u && name.equals(u.name); } } Map<User, String> map = new HashMap<>(); User u = new User(); u.name = "Bob"; map.put(u, "developer"); u.name = "Alice"; System.out.println(map.get(u));
Ответ от нейросети
sobes.tech AI
В данном примере происходит изменение поля name объекта User после того, как он был использован в качестве ключа в HashMap.
HashMap использует хэш-код ключа для определения места хранения значения. При вставке map.put(u, "developer") вызывается u.hashCode(), который зависит от name ("Bob"). После изменения u.name = "Alice" хэш-код объекта изменился, но объект остался на прежней позиции в таблице.
При вызове map.get(u) будет вычислен новый хэш-код (для "Alice"), который не совпадает с исходным, и поиск не найдет элемент. В итоге будет выведено null.
Вывод: нельзя изменять поля объекта, участвующего в вычислении hashCode и equals, если он используется как ключ в HashMap.
Пример демонстрации:
User u = new User();
u.name = "Bob";
Map<User, String> map = new HashMap<>();
map.put(u, "developer");
u.name = "Alice";
System.out.println(map.get(u)); // null
Чтобы избежать такой проблемы, поля, участвующие в hashCode и equals, должны быть неизменяемыми или объект должен быть immutable.