Что произойдёт при попытке положить null-ключ в TreeMap?
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 оказывались в конце?
Разбор темы
- TreeMap, TreeSet и сортировка
Красно-чёрное дерево, NavigableMap, Comparable против Comparator, согласованность с equals и TimSort.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.