Вопрос с собеседования · Java

Что произойдёт при попытке положить null-ключ в TreeMap?

MiddleКоллекции
Коротко

NullPointerException: TreeMap сравнивает ключи, а null сравнить естественным порядком нельзя. HashMap допускает один null-ключ.

  • Исключение — компаратор, явно обрабатывающий null (Comparator.nullsFirst)
  • ConcurrentHashMap и Hashtable запрещают и null-значения
  • Map.of тоже запрещает null

А ещё null-ключи вообще лучше не использовать

Подробно

Разница вытекает из устройства: хеш-таблице достаточно вычислить бакет, и для null он задан особым случаем, а дереву нужно упорядочить ключ относительно соседей. Единственное исключение — если задан компаратор, который явно умеет обрабатывать null. Полезно помнить и остальную картину по null: HashMap допускает один null-ключ и любое число null-значений; Hashtable и ConcurrentHashMap запрещают и то и другое, потому что в конкурентной карте невозможно отличить «значение null» от «ключа нет»; ArrayDeque тоже запрещает null, так как использует его как признак пустоты.

Что хотят услышать

  • Причина NPE.
  • Поведение других карт.

Частые ошибки

  • Обобщать поведение HashMap на все карты.
  • Забывать, что ConcurrentHashMap запрещает null-значения.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Ключ будет добавлен и окажется первым при обходе, как наименьший
  • ✗Ключ будет добавлен, но потом не найдётся ни через get, ни через containsKey
  • ✓NullPointerException: ключ нужно сравнить, а null нельзя сравнить естественным порядком
  • ✗Будет брошено IllegalArgumentException

Что спросят дальше

  • Почему ConcurrentHashMap не разрешает null-значения?
  • Как отсортировать так, чтобы null оказывались в конце?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования