Если вы хотите хранить пары ключ-значение (key-value) в программе Java, то коллекции Java предлагают для этого множество вариантов в зависимости от ваших потребностей. К ним относятся LinkedHashmap, HashMap и TreeMap. Ключевые различия между этими тремя классами заключаются в их внутренней реализации и специфике применения в определенных случаях. Кофе-брейк #132. Знакомимся с ZGC, новейшим сборщиком мусора JDK. В чем разница между HashMap, LinkedHashMap и TreeMap в Java - 2

Различия между HashMap, LinkedHashMap и TreeMap в Java

Вот основные различия между тремя упомянутыми классами, основанные на реализации, упорядочении, сортировке и поддержке нулевых ключей и значений.

Реализация

И HashMap, и LinkedHashMap реализуют интерфейс Map, тогда как TreeMap реализует интерфейсы Map, NavigableMap и vSortedMap. LinkedHashMap реализован как корзина со списком с двойной связью (double-linked list bucket), HashMap реализован как хэш-таблица, а TreeMap реализован по древовидному принципу.

Заказ и сортировка

  • HashMap не дает никаких гарантий относительно порядка итераций. Однако он может полностью меняться при добавлении новых элементов.

  • LinkedHashMap будет выполнять итерацию в том порядке, в котором записи были помещены в карту.

  • TreeMap выполняет итерацию в соответствии с “естественным порядком” ключей в соответствии с их методом compareTo() (или внешним Comparator). Также он реализует интерфейс SortedMap, который содержит методы, зависящие от порядка сортировки.

Нулевые ключи и значения

HashMaps и LinkedHashMap поддерживают нулевые значения, а также ключевые значения, в то время как TreeMap не поддерживают нулевые значения, поскольку они поддерживают естественные типы элементов. Для наглядного примера давайте создадим HashMap, LinkedHashMap и TreeMap.

import java.util.HashMap;

import java.util.LinkedHashMap;

import java.util.Map;

import java.util.TreeMap;

public class HashMap_LinkedHashMap_TreeMap {

            public static void main(String[] args) {

                  Map Treemapu = new TreeMap();

                  Treemapu.put("First", "Java");

                  Treemapu.put("Second", "Python");

                  System.out.println("TreeMap values are: \n" + Treemapu);

                  Map Hashimapu = new HashMap();

                  Hashimapu.put("First", "Java");

                  Hashimapu.put("Second", "Python");

                  System.out.println("HashMap Values are: \n" + Hashimapu);

                  Map LinkedHashiMapu = new LinkedHashMap();

                  LinkedHashiMapu.put("First", "Java");

                  LinkedHashiMapu.put("Second", "Python");

                  System.out.println("LinkedHashMap values are: \n" + LinkedHashiMapu);

            }

}
На выходе получим:
{First=Java, Second=Python} HashMap Values are: {Second=Python, First=Java} LinkedHashMap values are: {First=Java, Second=Python}
Таким образом все три класса представляют собой сопоставление от уникальных ключей к значениям и, следовательно, реализуют интерфейс Map.
  • HashMap — это карта, основанная на хэшировании ключей. Он поддерживает операции O (1) get/put. Ключи должны иметь последовательные реализации hashCode() и equals().

  • LinkedHashMap очень похож на HashMap, но он имеет порядок, по которому элементы добавляются (или доступны), поэтому порядок итерации совпадает с порядком размещения (или порядком доступа, в зависимости от параметров конструкции).

  • TreeMap — это отображение по принципу дерева. Его операции put/get принимают время O (log n). Для этого требуется, чтобы элементы имели некоторый механизм сравнения, либо со сравнением, либо с компаратором. Порядок итераций определяется этим механизмом.