Ответ
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будет присутствовать ровно один раз.