Автор оригинала: 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) { Mapmap = 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 TreeMapmap = 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