Как решить использовать HashMap или TreeMap?

Java

Раскованная, любовь всей жизни. Культиватор 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);        }    }}