Получить доступ

В каком порядке TreeMap отдаёт свои ключи при обходе?

JuniorКоллекции
Ещё спрашивают так:
  • Как устроен TreeMap?
  • Чем TreeMap отличается от HashMap?
  • Что такое Comparable и Comparator?
Коротко

Всегда в порядке сортировки ключей — по естественному порядку (Comparable) или по переданному компаратору.

  • Красно-чёрное дерево: операции O(log n)
  • Даёт диапазоны и поиск ближайшего: headMap, tailMap, floorKey, ceilingKey

А ещё Равенство ключей определяет compareTo/compare, а не equals

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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) и дерево в основе.
  • Операции с диапазонами — плюс.

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

  • Использовать дерево там, где хватает хеш-таблицы, и терять в скорости.
  • Класть в него ключи, для которых не определён порядок сравнения.

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

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

Показать варианты и ответ
  • ✓В порядке сортировки ключей — по естественному порядку или по переданному компаратору
  • ✗В порядке добавления записей
  • ✗В произвольном порядке, зависящем от хешей
  • ✗В порядке, обратном добавлению

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

  • Какие запросы умеет только эта реализация?
  • Что произойдёт при попытке положить null-ключ?

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем