Раскованная, любовь всей жизни. Культиватор Java (идентификатор общедоступной учетной записи WeChat: культиватор Java), обратите внимание.
представлять
TreeMap<K,V>
Значение ключа необходимо для реализацииjava.lang.Comparable
, поэтому при итерации TreeMap по умолчанию сортируется в порядке возрастания значения Key; реализация TreeMap основана на красно-черной древовидной структуре. Подходит для обхода ключей в естественном или пользовательском порядке.
HashMap<K,V>
Значение ключа реализует хешированиеhashCode()
, распределение хэшированное, равномерное, не поддерживает сортировку, структура данных в основном представляет собой ведро (массив), связанный список или красно-черное дерево. Подходит для вставки, удаления и позиционирования элементов на карте.
В заключение
TreeMap следует использовать, если вам нужно получить упорядоченный результат (поскольку порядок элементов в HashMap не фиксирован). Кроме того, поскольку HashMap имеет лучшую производительность, мы будем использовать HashMap большую часть времени, когда сортировка не требуется.
расширять
1. Реализация HashMap и TreeMap
HashMap: на основе реализации хеш-таблицы. Использование HashMap требует явного определения добавленного класса ключа.hashCode()
а такжеequals()
[Может быть переписаноhashCode()
а такжеequals()
], чтобы оптимизировать использование пространства HashMap, вы можете настроить начальную емкость и коэффициент загрузки.
-
HashMap(): создает пустую хеш-карту.
-
HashMap(Map m): строит хэш-карту и добавляет все карты карты m
-
HashMap(int initialCapacity): создает пустую хеш-карту с определенной емкостью.
-
HashMap(int initialCapacity, float loadFactor): создает пустую хеш-карту с определенной емкостью и коэффициентом загрузки.
-
TreeMap: основан на реализации красно-черного дерева. TreeMap не имеет параметров настройки, потому что дерево всегда находится в равновесии.
-
TreeMap(): строит пустое дерево карты.
-
TreeMap(Map m): построить дерево карт и добавить все элементы в карту m.
-
TreeMap (Comparator c): строит дерево карт и сортирует ключи с помощью определенного компаратора.
-
TreeMap(SortedMap s): Постройте дерево карт, добавьте все карты в дерево карт и отсортируйте, используя тот же компаратор, что и отсортированные карты.
2. И HashMap, и TreeMap не являются потокобезопасными.
HashMap наследует абстрактный класс AbstractMap, а TreeMap наследует интерфейс SortedMap.
Абстрактный класс AbstractMap: переопределяет методы equals() и hashCode(), чтобы гарантировать, что две одинаковые карты возвращают один и тот же хэш-код. Две карты равны, если они имеют одинаковый размер, содержат одни и те же ключи и каждый ключ соответствует одному и тому же значению на обеих картах. Хэш-код карты представляет собой сумму хэш-кодов элементов карты, где каждый элемент является реализацией интерфейса Map.Entry. Следовательно, две равные карты сообщают об одном и том же хэш-коде независимо от внутреннего порядка карт.
Интерфейс SortedMap: используется для поддержания упорядоченного порядка ключей. Интерфейс SortedMap предоставляет методы доступа к представлениям (подмножествам) карты, включая две конечные точки. Работа с SortedMap аналогична работе с SortedSet, за исключением того, что сортировка применяется к ключам карты. Элементы, добавляемые в класс реализации SortedMap, должны реализовывать интерфейс Comparable, в противном случае вы должны предоставить его конструктору реализацию интерфейса Comparator. Класс TreeMap является его единственной реализацией.
3. TreeMap по умолчанию сортируется по возрастанию, как сделать по убыванию
Реализовано с помощью пользовательского компаратора
Определите класс компаратора, реализуйте интерфейс Comparator, переопределите метод сравнения и задайте два параметра.Эти два параметра сравниваются путем вызова compareTo, а правила compareTo по умолчанию:
-
Возвращает значение 0, если строка параметра равна этой строке;
-
Возвращает значение меньше 0, если эта строка меньше строкового аргумента;
-
Возвращает значение больше 0, если эта строка больше строкового аргумента.
При настройке компаратора к возврату добавляется лишний знак минус, и результат сравнения возвращается в обратном виде, код такой:
static class MyComparator implements Comparator{ @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub String param1 = (String)o1; String param2 = (String)o2; return -param1.compareTo(param2); }}
После этого инициализируйте экземпляр компаратора через класс MyComparator и передайте его в качестве параметра конструктору TreeMap:
MyComparator comparator = new MyComparator();Map<String,String> map = new TreeMap<String,String>(comparator);
Таким образом, мы можем использовать собственный компаратор для достижения убывающего порядка
public class MapTest { public static void main(String[] args) { //初始化自定义比较器 MyComparator comparator = new MyComparator(); //初始化一个map集合 Map<String,String> map = new TreeMap<String,String>(comparator); //存入数据 map.put("a", "a"); map.put("b", "b"); map.put("f", "f"); map.put("d", "d"); map.put("c", "c"); map.put("g", "g"); //遍历输出 Iterator iterator = map.keySet().iterator(); while(iterator.hasNext()){ String key = (String)iterator.next(); System.out.println(map.get(key)); } } static class MyComparator implements Comparator{ @Override public int compare(Object o1, Object o2) { // TODO Auto-generated method stub String param1 = (String)o1; String param2 = (String)o2; return param1.compareTo(param2); } }}