Гид по технологиям

Java TreeMap — что это и как использовать

5 min read Java Обновлено 01 Apr 2026
Java TreeMap — что это и как использовать
Java TreeMap — что это и как использовать

Дерево с зелёными листьями, символ структуры данных дерева

TreeMap — реализация интерфейса Map, основанная на сбалансированном дереве (Red‑Black tree). Класс расширяет AbstractMap и имеет два параметра типа: первый для ключей, второй для значений. TreeMap хранит пары ключ‑значение и поддерживает стандартные операции CRUD (создание, чтение, обновление, удаление).

Как создать TreeMap в Java

Класс TreeMap предоставляет четыре конструктора; самый простой и часто используемый — конструктор по умолчанию, который создаёт пустой TreeMap.

// Create a new tree map  
TreeMap customers = new TreeMap();

Код выше создаёт пустой tree map с именем customers.

Заполнение структуры TreeMap

Метод put() добавляет пару ключ‑значение в TreeMap. Он принимает два аргумента — ключ и значение. Порядок добавления может быть произвольным: TreeMap будет хранить записи в порядке возрастания ключей.

// Populate a tree map  
customers.put(105, "Jessica Jones");  
customers.put(102, "Mark Williams");  
customers.put(104, "Phil Blair");  
customers.put(101, "Kim Brown");  
customers.put(103, "Jim Riley");

Пример выше добавляет пять клиентов в произвольном порядке; при выводе они будут упорядочены по ключам.

Просмотр элементов TreeMap

TreeMap хранит свои данные в объекте Map, поэтому быстрый способ увидеть все записи — вывести сам объект в консоль:

// View all tree map items as an object  
System.out.println(customers);

Это выведет:

{101=Kim Brown, 102=Mark Williams, 103=Jim Riley, 104=Phil Blair, 105=Jessica Jones}

Элементы отображаются в порядке возрастания ключей. Чтобы пройтись по записям и получить ключи и значения по отдельности, используйте entrySet():

// View all items with an iterator  
for (Entry customer : customers.entrySet()) {  
    System.out.println("Key: " + customer.getKey() + " Value: " + customer.getValue());  
}

Вывод:

Key: 101 Value: Kim Brown  
Key: 102 Value: Mark Williams  
Key: 103 Value: Jim Riley  
Key: 104 Value: Phil Blair  
Key: 105 Value: Jessica Jones

Обновление элементов TreeMap

Для обновления существующего значения используйте метод replace(). Существуют две перегрузки: первая принимает ключ и новое значение; вторая — ключ, старое значение и новое значение (безопасная замена, учитывающая текущее значение).

// Replace existing value  
customers.replace(101,"Kim Smith");                      
System.out.println(customers);

Результат:

{101=Kim Smith, 102=Mark Williams, 103=Jim Riley, 104=Phil Blair, 105=Jessica Jones}

Альтернативная форма:

// Replace existing value  
customers.replace(103,"Jim Riley", "Michelle Noah");                      
System.out.println(customers);

Результат:

{101=Kim Brown, 102=Mark Williams, 103=Michelle Noah, 104=Phil Blair, 105=Jessica Jones}

Второй вариант безопасен, когда нужно заменить значение только если текущее совпадает с ожидаемым.

Удаление элементов из TreeMap

Для удаления одного элемента используйте remove(key): он удаляет запись по ключу и возвращает удалённое значение.

// Remove an item  
customers.remove(104);  
System.out.println(customers);

Выведет:

{101=Kim Smith, 102=Mark Williams, 103=Michelle Noah, 105=Jessica Jones}

Чтобы очистить весь TreeMap, используйте clear().

Важно: TreeMap не допускает null в качестве ключа; попытка вставить null ключ приведёт к NullPointerException. Значения могут быть null, но это зависит от логики приложения.

TreeMap и HashMap: сравнение

TreeMap и HashMap обе реализуют Map, но используют разные внутренние структуры и имеют разные свойства:

СвойствоTreeMapHashMap
Внутренняя структураКрасно‑чёрное дерево (упорядочено)Хеш‑таблица (неупорядочено)
Поддержка null ключаНетОдин null ключ допускается
Порядок элементовОтсортирован по ключамНе гарантируется
Скорость операцийO(log n) для поиска/вставки/удаленияO(1) (амортизированно)
Когда выбиратьКогда нужен упорядоченный перебор или диапазонные операцииКогда нужна максимальная производительность без порядка

Когда TreeMap лучше

  • Нужно обходить элементы в отсортированном порядке.
  • Необходимы диапазонные операции (headMap, tailMap, subMap).
  • Требуется детерминированный порядок независимо от хешей.

Когда HashMap лучше

  • Нет требований к порядку, важна скорость.
  • Большие объёмы данных и высокая интенсивность вставок/поиска.

Практическая методология выбора

  1. Определите требование к порядку: нужен ли отсортированный порядок ключей? Если да — TreeMap. Если нет — HashMap.
  2. Оцените нагрузку: если приоритет — скорость доступа, предпочитайте HashMap.
  3. Проверьте возможность null‑ключей: если вы используете null как ключ, HashMap — выбор по умолчанию.
  4. Если нужны диапазонные запросы (например, все ключи между A и B), TreeMap предоставляет subMap/headMap/tailMap.

Быстрая памятка по методам

  • put(key, value) — вставить или обновить запись.
  • get(key) — получить значение по ключу.
  • replace(key, value) и replace(key, oldValue, newValue) — заменить значение.
  • remove(key) — удалить запись по ключу.
  • clear() — удалить все записи.
  • entrySet(), keySet(), values() — получить представления коллекций.

Факт‑бокс: ключевые показатели

  • Структура: красно‑чёрное дерево (самобалансирующееся бинарное дерево).
  • Сложность операций: поиск/вставка/удаление — O(log n).
  • Порядок: элементы всегда отсортированы по ключу.
  • Поддержка null‑ключей: запрещена.

Роль‑ориентированные контрольные списки

Разработчик:

  • Использовать put/get/replace/remove согласно требованию.
  • Обработать возможные NullPointerException при использовании null в ключах.
  • Тестировать крайние случаи (пустая карта, дублирование ключей).

Архитектор:

  • Выбрать структуру данных исходя из требований к порядку и производительности.
  • Оценить использование ConcurrentSkipListMap, если нужна потокобезопасная сортированная карта.

QA:

  • Проверить корректность сортировки ключей.
  • Проверить поведение при попытке добавить null ключ.
  • Проверить replace(oldValue, newValue) и remove(key) на ожидаемом результате.

Примеры крайних случаев и когда TreeMap не подходит

  • Вставка большого количества данных при жёстких требованиях по задержке — HashMap обычно быстрее.
  • Нужна потокобезопасность для множества потоков — рассмотрите ConcurrentHashMap или ConcurrentSkipListMap.
  • Ключи не имеют естественного порядка и сравнение дорогостоящее — накладные расходы на поддержание порядка могут быть существенны.

Диаграмма выбора структуры (Mermaid)

flowchart TD
  A[Нужен упорядоченный перебор?] -->|Да| B[TreeMap]
  A -->|Нет| C[HashMap]
  B --> D{Нужна потокобезопасность}
  D -->|Да| E[ConcurrentSkipListMap]
  D -->|Нет| F[TreeMap]
  C --> G{Требуется потокобезопасность}
  G -->|Да| H[ConcurrentHashMap]
  G -->|Нет| I[HashMap]

Глоссарий (одной строкой)

  • Map — коллекция пар ключ‑значение.
  • TreeMap — реализация Map на базе сбалансированного дерева, поддерживает порядок.
  • HashMap — реализация Map на базе хеш‑таблицы, обеспечивает более быструю амортизированную вставку/поиск.

Заключение

TreeMap — удобный выбор, когда важен упорядоченный по ключам доступ и операции диапазонов. Для максимально быстрой произвольной выборки и вставки предпочтительнее HashMap, если порядок не нужен. Всегда учитывайте требования к null‑ключам, производительности и потокобезопасности при выборе реализации Map.

Ключевые источники для проверки API: документация JDK по java.util.TreeMap и java.util.HashMap.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Калибровочные кадры в астрофотографии — руководство
Астрофотография

Калибровочные кадры в астрофотографии — руководство

Проверить число циклов зарядки iPhone
Гайды

Проверить число циклов зарядки iPhone

SPI и I2C на Raspberry Pi: включение и использование
Raspberry Pi

SPI и I2C на Raspberry Pi: включение и использование

Как подписать PDF: 6 проверенных способов
Документы

Как подписать PDF: 6 проверенных способов

Alt-Tab не работает в Windows — как исправить
Windows

Alt-Tab не работает в Windows — как исправить

Noisli — звуки для фокуса и снижения стресса
Продуктивность

Noisli — звуки для фокуса и снижения стресса