Sobes.tech
Назад к вопросам
Senior
6

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.