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

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

JuniorКоллекции
Ещё спрашивают так:
  • Как устроен 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-ключ?

Разбор темы

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

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

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

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

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