Почему изменение хеш-кода объекта, используемого в качестве ключа в HashMap, приводит к тому, что поиск возвращает ноль?
Рассмотрим следующий сценарий:
Object o1 = new Object();
Object o2 = new Object();
HashMap<Object, Object> map = new HashMap<Object, Object>();
map.put(o1, o2);
boolean test1 = map.get(o1) == o2; // This evaluates to true
// Now lets say we alter the state of o1:
o1.setSomeInternalState(Object newState);
boolean test2 = map.get(o1) == o2; // This evaluates to false, because now map.get(o1) returns null
Предположим, что класс для o1 переопределенequals()
а такжеhashCode()
.
Я столкнулся с этой проблемой во время отладки, потому что я явно переопределилequals
а такжеhashCode
на одном конкретном объекте, который я использую в некоторой бизнес-логике. Я могу полностью понять, почему хеш-код объекта изменяется, когда я изменяю его состояние, но почему map.get (o1) должен возвращать ноль из-за этого? Существует только один объект, поэтому не должен совпадать хэш-код ключа?