Разрешает ли HashMap в Java использование null в качестве ключа и значения?

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

Ответ

Да, HashMap имеет следующую политику работы с null:

  • Ключ (key): Разрешен один null-ключ. Попытка добавить второй null-ключ перезапишет значение, связанное с первым.
  • Значение (value): Разрешено неограниченное количество null-значений для любых ключей (включая null-ключ).

Пример:

HashMap<String, String> map = new HashMap<>();
map.put(null, "Value for null key"); // Допустимо
map.put("key1", null);               // Допустимо
map.put(null, "Overwritten value");  // Перезаписывает предыдущее значение для null-ключа

System.out.println(map.get(null));    // Выведет: "Overwritten value"
System.out.println(map.get("key1"));  // Выведет: null

Важные исключения:

  • Hashtableне разрешает null ни в качестве ключа, ни в качестве значения (бросает NullPointerException).
  • ConcurrentHashMapне разрешает null ни в качестве ключа, ни в качестве значения. Это решение связано с неоднозначностью семантики get(key) при отсутствии ключа и наличии null-значения в конкурентной среде.

Почему это важно? Выбор структуры данных должен учитывать необходимость хранения null, особенно в многопоточных приложениях.