В каком порядке TreeMap отдаёт свои ключи при обходе?
- Как устроен TreeMap?
- Чем TreeMap отличается от HashMap?
- Что такое Comparable и Comparator?
Всегда в порядке сортировки ключей — по естественному порядку (Comparable) или по переданному компаратору.
- Красно-чёрное дерево: операции O(log n)
- Даёт диапазоны и поиск ближайшего: headMap, tailMap, floorKey, ceilingKey
А ещё Равенство ключей определяет compareTo/compare, а не equals
Подробно
TreeMap основан на сбалансированном красно-чёрном дереве. Ключи хранятся отсортированными, поэтому обход идёт по возрастанию.
Как задаётся порядок:
- естественный — ключ реализует
Comparable(String,Integer,LocalDate); - внешний —
Comparator, переданный в конструктор:new TreeMap<>(Comparator.reverseOrder()).
Цена сортировки — операции за O(log n) вместо O(1) у хеш-таблицы. Взамен есть то, чего у HashMap нет:
- диапазоны:
subMap,headMap,tailMap; - ближайшие ключи:
floorKey,ceilingKey,firstKey,lastKey.
Тонкость: одинаковость ключей TreeMap определяет через сравнение (compareTo == 0), а не через equals. Если компаратор считает разные объекты равными, второй перезапишет первый. null в качестве ключа при естественном порядке не допускается.
Критерий выбора: нужен порядок или диапазоны — TreeMap, нужен только доступ по ключу — HashMap.
Пример
TreeMap<Integer, String> grades = new TreeMap<>(Map.of(90, "A", 75, "B", 60, "C"));
grades.floorKey(82); // 75 — ближайший ключ снизу
grades.headMap(75, true); // {60=C, 75=B}Что хотят услышать
- Обход в порядке сортировки ключей.
- Comparable и Comparator.
- Сложность O(log n) и дерево в основе.
- Операции с диапазонами — плюс.
Частые ошибки
- Использовать дерево там, где хватает хеш-таблицы, и терять в скорости.
- Класть в него ключи, для которых не определён порядок сравнения.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗В порядке добавления записей, как LinkedHashMap
- ✗В произвольном порядке, зависящем от хешей ключей
- ✗В порядке, обратном добавлению
- ✓В отсортированном: по compareTo или компаратору
Что спросят дальше
- Какие запросы умеет только эта реализация?
- Что произойдёт при попытке положить null-ключ?
Разбор темы
- TreeMap, TreeSet и сортировка
Красно-чёрное дерево, NavigableMap, Comparable против Comparator, согласованность с equals и TimSort.
Связанные вопросы
- Что произойдёт при попытке положить null-ключ в TreeMap? Middle
- Чем Comparable отличается от Comparator и что значит согласованность порядка с equals? Middle
- Нужно быстро находить ближайшую запись с ключом не больше заданного и выбирать все записи в диапазоне дат. Какая структура подходит? Middle
- Чем HashSet, LinkedHashSet и TreeSet отличаются? Junior
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.