Каковы преимущества и недостатки TreeMap в Java?

«Каковы преимущества и недостатки TreeMap в Java?» — вопрос из категории Java Core, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

TreeMap<K, V> — реализация интерфейса SortedMap и NavigableMap, основанная на красно-черном дереве.

Преимущества:

  • Автоматическая сортировка: Элементы хранятся в порядке возрастания ключей (согласно их естественному порядку Comparable или переданному Comparator). Итерация происходит в этом порядке.
  • Эффективные операции с диапазонами: Методы subMap(), headMap(), tailMap() позволяют быстро получать представления части карты.
  • Поиск границ: Методы lowerKey(), floorKey(), ceilingKey(), higherKey() для нахождения соседних ключей.
  • Предсказуемая производительность: Операции put(), get(), remove() выполняются за O(log n), что стабильно для больших данных.

Недостатки:

  • Производительность: O(log n) медленнее, чем O(1) у HashMap для основных операций, если не требуется сортировка.
  • Требования к ключам: Ключи должны реализовывать Comparable или в конструктор необходимо передать Comparator. Иначе будет выброшено ClassCastException.
  • Запрет null-ключей: Попытка вставить null в качестве ключа вызовет NullPointerException.

Пример использования:

// TreeMap с натуральным порядком (Integer реализует Comparable)
TreeMap<Integer, String> scoreMap = new TreeMap<>();
scoreMap.put(150, "Alice");
scoreMap.put(95, "Bob");
scoreMap.put(200, "Charlie");

System.out.println(scoreMap); // {95=Bob, 150=Alice, 200=Charlie} - отсортировано!

// Получение диапазона
SortedMap<Integer, String> topScores = scoreMap.tailMap(100);
System.out.println(topScores); // {150=Alice, 200=Charlie}

// Поиск границ
Integer key = scoreMap.lowerKey(150); // Метод NavigableMap
System.out.println(key); // 95

Когда использовать: Когда критически важен порядок элементов или часто требуются операции с диапазонами. Если нужен просто быстрый доступ по ключу без порядка — выбирайте HashMap.