Автор оригинала: Pankaj Kumar.
Древовидная карта Java является одной из реализаций карты и является частью платформы Java Collections.
Древовидная карта Java
Некоторые из важных моментов, которые следует помнить о карте деревьев в java, заключаются в следующем;
- Помимо реализации интерфейса карты, Java TreeMap также реализует
навигационную картуи косвенно реализуетСортированную карту| интерфейс . Древовидная карта также расширяет Абстрактную картукласс.Записи древовидной карты сортируются в естественном порядке ее ключей. Он также предоставляет конструктор для предоставления - Компаратора , который будет использоваться для заказа. Поэтому, если вы используете какой-либо класс в качестве ключа, убедитесь, что он реализует сопоставимый интерфейс для естественного упорядочения. Ознакомьтесь с вопросами для интервью с коллекциями java , чтобы понять важность этих методов. Реализация Java TreeMap обеспечивает гарантированную стоимость регистрации(n) времени для операций containsKey, get, put и remove.
- Древовидная карта не синхронизирована и, следовательно, не является потокобезопасной. Для многопоточных сред вы можете синхронизировать обернутый файл с помощью
- Коллекций.Метод synchronizedSortedMap
.Методы древовидной карты для получения набора ключей и значений возвращают - Итератор , которые по своей природе быстры к сбою, поэтому любая параллельная модификация приведет к исключению ConcurrentModificationException . Древовидная карта в java не допускает нулевых ключей, однако вы можете иметь несколько нулевых значений, связанных с разными ключами.
Пример карты деревьев Java
Давайте посмотрим на пример программы java TreeMap, чтобы увидеть ее естественную сортировку в действии.
package com.journaldev.java;
import java.util.Comparator;
import java.util.Map;
import java.util.TreeMap;
public class JavaTreeMapExample {
public static void main(String[] args) {
Map map = new TreeMap<>();
map.put(10, "10");
map.put(1, "1");
map.put(5, "5");
System.out.println(map);
map = new TreeMap<>(new Comparator() {
@Override
public int compare(Integer x, Integer y) {
return (x > y) ? -1 : ((x == y) ? 0 : 1);
}
});
map.put(10, "10");
map.put(1, "1");
map.put(5, "5");
System.out.println(map);
}
}
Это приведет к снижению производительности.
{1=1, 5=5, 10=10}
{10=10, 5=5, 1=1}
Обратите внимание, что когда мы не предоставляем компаратор при создании карты деревьев, он использует метод Integer compareTo для упорядочения ключей. Вот почему ключи находятся в порядке возрастания, даже если мы вставляем их в любом порядке.
В следующий раз мы предоставим реализацию компаратора для изменения порядка, и он будет использоваться в TreeMap. Таким образом, ключи хранятся в порядке убывания.
Для простоты я предоставляю анонимную реализацию класса Comparator выше, мы можем использовать лямбда-выражения, чтобы сделать то же самое в одной строке.
map = new TreeMap<>((x,y) -> {return (x > y) ? -1 : ((x == y) ? 0 : 1);});
Древовидная карта против хэш-карты
Древовидная карта и хэш-карта реализуют интерфейс карты и являются частью структуры сбора данных. Давайте рассмотрим некоторые различия между картой деревьев и хэш-картой.
- Записи на карте деревьев сортируются в естественном порядке ключей, в то время как HashMap не хранит записи в любом порядке.
- Древовидная карта не допускает нулевой ключ, в то время как у нас может быть один нулевой ключ в HashMap.
- Поскольку TreeMap хранит записи в отсортированном виде, это немного медленнее, чем HashMap при хранении и извлечении объектов.
- TreeMap использует реализацию навигационной карты на основе красно-черного дерева, в то время как HashMap использует реализацию алгоритма хеширования.
- TreeMap реализует навигационную карту, поэтому вы получаете некоторые дополнительные функции, которых нет в HashMap. Например – подкарта, первый ключ, последний ключ, карта головы, карта хвоста и т.д.
Когда использовать карту деревьев в Java
Большую часть времени HashMap будет достаточно для использования в качестве реализации карты в вашей программе. Но если у вас есть какие-то особые требования, связанные с сортировкой, поиском следующего нижнего и верхнего ключа, работой над подкартой, тогда вы можете перейти к карте деревьев.
Давайте рассмотрим простой пример программы на карте деревьев, показывающий использование методов навигационной карты.
package com.journaldev.java;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
public class JavaTreeMapNavigationExamples {
public static void main(String[] args) {
//we have to define object as TreeMap to use NavigableMap functions
TreeMap map = new TreeMap<>();
for(int i=0;i<10;i++) {
map.put(i, i+"");
}
System.out.println(map);
//find id closest to 5, lower and higher
Entry entry = map.lowerEntry(5);
System.out.println("Closest Lower key than 5 is "+entry);
entry = map.higherEntry(5);
System.out.println("Closest Higher key than 5 is "+entry);
System.out.println("Closest Lower key than 4 is "+map.lowerKey(4));
entry = map.floorEntry(5);
System.out.println("Closest floor entry than 5 is "+entry);
entry = map.ceilingEntry(4);
System.out.println("Closest ceiling key than 4 is "+entry);
entry = map.firstEntry();
System.out.println("First Entry is "+entry);
entry = map.lastEntry();
System.out.println("Last Entry is "+entry);
Map reversedMap = map.descendingMap();
System.out.println("Reversed Map: "+reversedMap);
//poll and remove first, last entries
entry = map.pollFirstEntry();
System.out.println("First Entry is "+entry);
entry = map.pollLastEntry();
System.out.println("Last Entry is "+entry);
System.out.println("Updated Map: "+map);
//submap example
Map subMap = map.subMap(2, true, 6, true);
System.out.println("Submap: "+subMap);
subMap = map.headMap(5, true);
System.out.println("HeadMap: "+subMap);
subMap = map.tailMap(5, true);
System.out.println("TailMap: "+subMap);
}
}
Когда мы выполняем вышеприведенный пример программы TreeMap, она выдает следующий результат.
{0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8, 9=9}
Closest Lower key than 5 is 4=4
Closest Higher key than 5 is 6=6
Closest Lower key than 4 is 3
Closest floor entry than 5 is 5=5
Closest ceiling key than 4 is 4=4
First Entry is 0=0
Last Entry is 9=9
Reversed Map: {9=9, 8=8, 7=7, 6=6, 5=5, 4=4, 3=3, 2=2, 1=1, 0=0}
First Entry is 0=0
Last Entry is 9=9
Updated Map: {1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7, 8=8}
Submap: {2=2, 3=3, 4=4, 5=5, 6=6}
HeadMap: {1=1, 2=2, 3=3, 4=4, 5=5}
TailMap: {5=5, 6=6, 7=7, 8=8}
Все вышеперечисленные операции понятны сами по себе, пожалуйста, ознакомьтесь с официальной документацией или прокомментируйте здесь, если вас смущает что-либо из этого.
Это все для краткого обзора древовидной карты на java, надеюсь, вам понравилось ее читать.
Ссылки: Официальная документация по API