Сначала ответь вслух
Скажи ответ вслух хотя бы пару минут, потом открой эталон и сравни. Эталон открыт всем и не требует входа.
Показать ответ
Эталонный ответ
HashMap запоминает хеш ключа в момент put и кладёт запись в соответствующую корзину. После изменения поля новый hashCode указывает на другую корзину, а даже в той же корзине не совпадёт сохранённый хеш.
class Key {
String name;
Key(String name) { this.name = name; }
@Override public boolean equals(Object o) { return o instanceof Key k && k.name.equals(name); }
@Override public int hashCode() { return name.hashCode(); }
}
Key key = new Key("a");
Map<Key, Integer> map = new HashMap<>();
map.put(key, 1);
key.name = "b";
map.get(key); // null
map.containsKey(key); // false
map.size(); // 1Запись живёт в карте, пока жива карта: удалить её можно только обходом через итератор. Поэтому ключами делают неизменяемые объекты: строки, числа, record с неизменяемыми компонентами.
Как у тебя получилось?
Уточняющие вопросы
Так обычно копают глубже. Раскрой строку, когда ответишь вслух.
Уточнение 1-го уровня: Как удалить такую запись?
Ответ уровня Middle
Через entrySet().iterator() и Iterator.remove(): итератор удаляет запись по сохранённому хешу и ссылке на узел, а не по новому hashCode.
Типичные ошибки
- Ждать, что HashMap сама пересчитает корзину после изменения ключа.
- Использовать сущности JPA с изменяемым id как ключи.
Первоисточники
Быстрые задания по теме
Проверь себя
Задание 1 из 3Два разных ключа дали одинаковый hashCode. Что сделает HashMap?