Что произойдёт при повторной вставке пары с ключом null в HashMap?

«Что произойдёт при повторной вставке пары с ключом null в HashMap?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

HashMap в Java допускает один ключ null. При повторной вставке пары с key=null происходит стандартная операция замены значения (update) для существующего ключа null.

Пример:

HashMap<String, String> map = new HashMap<>();
map.put(null, "Value1");
System.out.println(map.size()); // 1
System.out.println(map.get(null)); // "Value1"

map.put(null, "Value2"); // Замена!
System.out.println(map.size()); // 1 (размер не изменился)
System.out.println(map.get(null)); // "Value2"

Как это работает внутренне:

  • Хэш-код для null равен 0.
  • Ключ null хранится в бакете 0 (или в соответствующем бакете после применения маскирования).
  • Логика put() вычисляет бакет для null, находит там существующую Entry с ключом null и заменяет её значение.

Важные детали:

  • Поведение Hashtable отличается — он не позволяет использовать null ни в качестве ключа, ни в качестве значения.
  • ConcurrentHashMap также не допускает null-ключи (и null-значения) по соображениям безопасности многопоточности (невозможно отличить отсутствие ключа от ключа со значением null).
  • При итерации по keySet() или entrySet() ключ null будет присутствовать ровно один раз.