Разница между HashMap, LinkedHashMap и TreeMap

в чем разница между HashMap, LinkedHashMap и TreeMap в Java? Я не вижу никакой разницы в выходе, поскольку все три имеют keySet и values. Каковы Hashtables?

Map m1 = new HashMap();
m1.put("map", "HashMap");
m1.put("schildt", "java2");
m1.put("mathew", "Hyden");
m1.put("schildt", "java2s");
print(m1.keySet()); 
print(m1.values()); 

SortedMap sm = new TreeMap();
sm.put("map", "TreeMap");
sm.put("schildt", "java2");
sm.put("mathew", "Hyden");
sm.put("schildt", "java2s");
print(sm.keySet()); 
print(sm.values());

LinkedHashMap lm = new LinkedHashMap();
lm.put("map", "LinkedHashMap");
lm.put("schildt", "java2");
lm.put("mathew", "Hyden");
lm.put("schildt", "java2s");
print(lm.keySet()); 
print(lm.values());

15 ответов


все три класса использовать тег Map интерфейс и предлагают в основном те же функции. Наиболее важным отличием является порядок, в котором будет происходить итерация через записи:

  • HashMap не дает абсолютно никаких гарантий относительно порядка итерации. Он может (и будет) даже полностью меняться при добавлении новых элементов.
  • TreeMap будет повторяться в соответствии с "естественным порядком" ключей в соответствии с их compareTo() способ (или внешне поставляется Comparator). Кроме того, он реализует SortedMap интерфейс, который содержит методы, которые зависят от порядка сортировки.
  • LinkedHashMap будет повторяться в том порядке, в котором записи были помещены в карту

"Hashtable" - это общее название для хэш-карты. В контексте API Java, Hashtable - это устаревший класс от дней в Java 1.1 до коллекции рамок. Не должно быть используется больше, потому что его API загроможден устаревшими методами, которые дублируют функциональность, и его методы синхронизируются (что может снизить производительность и обычно бесполезно). Использовать ConcurrentHashMap вместо Hashtable.


Я предпочитаю визуальное представление:

╔══════════════╦═════════════════════╦═══════════════════╦═════════════════════╗
║   Property   ║       HashMap       ║      TreeMap      ║     LinkedHashMap   ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║ Iteration    ║  no guarantee order ║ sorted according  ║                     ║
║   Order      ║ will remain constant║ to the natural    ║    insertion-order  ║
║              ║      over time      ║    ordering       ║                     ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║  Get/put     ║                     ║                   ║                     ║
║   remove     ║         O(1)        ║      O(log(n))    ║         O(1)        ║
║ containsKey  ║                     ║                   ║                     ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║              ║                     ║   NavigableMap    ║                     ║
║  Interfaces  ║         Map         ║       Map         ║         Map         ║
║              ║                     ║    SortedMap      ║                     ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║              ║                     ║                   ║                     ║
║     Null     ║       allowed       ║    only values    ║       allowed       ║
║ values/keys  ║                     ║                   ║                     ║
╠══════════════╬═════════════════════╩═══════════════════╩═════════════════════╣
║              ║   Fail-fast behavior of an iterator cannot be guaranteed      ║
║   Fail-fast  ║ impossible to make any hard guarantees in the presence of     ║
║   behavior   ║           unsynchronized concurrent modification              ║
╠══════════════╬═════════════════════╦═══════════════════╦═════════════════════╣
║              ║                     ║                   ║                     ║
║Implementation║      buckets        ║   Red-Black Tree  ║    double-linked    ║
║              ║                     ║                   ║       buckets       ║
╠══════════════╬═════════════════════╩═══════════════════╩═════════════════════╣
║      Is      ║                                                               ║
║ synchronized ║              implementation is not synchronized               ║
╚══════════════╩═══════════════════════════════════════════════════════════════╝

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

  1. HashMap-это карта, основанная на хеширования ключи. Он поддерживает операции O (1) get/put. Ключи должны иметь последовательной реализации hashCode() и equals() для этого, чтобы работать.

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

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


видим, где каждый класс в иерархии классов на следующей диаграмме (больше). Дерева реализует SortedMap и NavigableMap while HashMap нет.

HashTable устарел и соответствующий ConcurrentHashMap класс должен быть использован. enter image description here


HashMap

  • он имеет значения пар (ключи,значения)
  • нет дублирование ключевых значений
  • ненумерованный несортированный
  • Он позволяет один нулевой ключ и более одного значения null

HashTable

  • то же, что и хэш-карта
  • он не позволяет нулевые ключи и нулевые значения

LinkedHashMap

  • это упорядоченная версия реализации Карты
  • на основе связанный список и структуры данных хэширования

TreeMap

  • заказать и sortered версия
  • на основе хеширование структуры данных!--4-->

просто еще один вклад из моего собственного опыта работы с картами, когда я буду использовать каждый из них:

  • HashMap-наиболее полезно при поиске наиболее эффективной (быстрой) реализации.
  • TreeMap (интерфейс SortedMap) - наиболее полезно, когда я обеспокоен возможностью сортировки или итерации по ключам в определенном порядке, который я определяю.
  • LinkedHashMap - сочетает в себе преимущества гарантированного заказа с TreeMap без увеличения стоимости обслуживания на картах. (Это почти так же быстро, как HashMap). В частности, LinkedHashMap также предоставляет отличную отправную точку для создания объекта кэша путем переопределения removeEldestEntry() метод. Это позволяет создать объект кэша, срок действия которого может истечь с использованием определенных критериев.

все три класса HashMap, TreeMap и LinkedHashMap осуществляет java.util.Map интерфейс и представляет отображение из уникального ключа в значения.

HashMap

  1. A HashMap содержит значения, основанные на ключе.

  2. содержит только уникальные элементы.

  3. это может иметь один нулевой ключ и несколько значений null.

  4. это поддерживает нет порядка!--37-->.

    public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

LinkedHashMap

  1. A LinkedHashMap содержит значения, основанные на ключе.
  2. содержит только уникальные элементы.
  3. это может иметь один нулевой ключ и несколько значений null.
  4. это то же самое, что HashMap вместо этого поддерживает порядок вставки. / / см. замедление класса ниже

    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

TreeMap

  1. A TreeMap содержит значения, основанные на ключе. Он реализует интерфейс NavigableMap и расширяет класс AbstractMap.
  2. содержит только уникальные элементы.
  3. он не может иметь нулевой ключ, но может иметь несколько нулевых значений.
  4. это то же самое как поддерживает возрастающем порядке(сортируется с использованием естественного порядка его ключа.).

    public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable

Hashtable

  1. хэш-таблица-это массив списка. Каждый список называется ведром. Позиция bucket определяется путем вызова метода hashcode (). Хэш-таблица содержит значения, основанные на ключе.
  2. он содержит только уникальный элементы.
  3. возможно, у него нет нулевого ключа или значения.
  4. это синхронизироваться.
  5. это устаревший класс.

    public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable

Ref: http://javarevisited.blogspot.in/2015/08/difference-between-HashMap-vs-TreeMap-vs-LinkedHashMap-Java.html


HashMap делает абсолютно не гарантирует порядок итерации. Он может (и будет) даже полностью меняться при добавлении новых элементов. TreeMap будет выполнять итерацию в соответствии с "естественным порядком" ключей согласно их методу compareTo () (или внешне поставленному Компаратор.) Кроме того, он реализует интерфейс SortedMap , который содержит методы, зависящие от этого порядка сортировки. LinkedHashMap будет повторяться в том порядке, в котором были помещены записи в карту!--2-->

посмотрите, как меняется производительность.. enter image description here

карта дерева, которая является реализацией отсортированной карты. Сложность операции put, get и containsKey равна O (log n) из-за естественного упорядочения


@Amit:SortedMap является интерфейсом, тогда как TreeMap - это класс, который реализует SortedMap интерфейс. Это означает, если следует протоколу, который SortedMap просит своих исполнителей сделать. Дерево, если оно не реализовано как дерево поиска, не может дать вам упорядоченные данные, потому что дерево может быть любым деревом. Таким образом, чтобы TreeMap работал как сортированный порядок, он реализует SortedMap ( e.G, двоичное дерево поиска-BST, сбалансированное BST, как AVL и R-B дерево, даже троичное дерево поиска-в основном используется для итеративных поисков по порядку).

public class TreeMap<K,V>
extends AbstractMap<K,V>
implements SortedMap<K,V>, Cloneable, Serializable

в ореховой скорлупе HashMap: дает данные в O (1) , отсутствие приказывать

TreeMap: дает данные в O (log N), база 2. с заказанными ключами

LinkedHashMap: хэш-таблица со связанным списком (подумайте об индексированном SkipList) возможность хранить данные в том, как он вставляется в дерево. Лучше всего подходит для реализации LRU ( наиболее давно использовавшийся ).


Это разные реализации одного и того же интерфейса. Каждая реализация имеет некоторые преимущества и некоторые недостатки (быстрая вставка, медленный поиск) или наоборот.

Подробности смотри в Javadoc в размере TreeMap, HashMap, LinkedHashMap.


Ниже приведены основные различия между HashMap и TreeMap

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

  2. внутренняя реализация HashMap использует хэширование, а TreeMap внутренне использует красно-черное дерево реализация.

  3. HashMap может хранить один нулевой ключ и много нулевых значений.TreeMap не может содержать нулевые ключи, но может содержать много нулевых значений.

  4. HashMap принимает постоянную производительность времени для основных операций, таких как get и put i.e O (1).Согласно документам Oracle, TreeMap обеспечивает гарантированную стоимость времени log (n) для метода get и put.

  5. HashMap намного быстрее, чем TreeMap, так как время производительности HashMap константа для большинства операций с картой времени журнала.

  6. HashMap использует метод equals() в сравнении, в то время как TreeMap использует метод compareTo () для поддержания порядка.

  7. HashMap реализует интерфейс карты, а TreeMap реализует интерфейс NavigableMap.


хэш-карта не сохраняет порядок вставки.
Образец. Хранилище HashMap Если вы вставляете ключи как

1  3
5  9
4   6
7   15
3   10

он может хранить его как

4  6
5  9
3  10
1  3
7  15

связанный Hashmap сохраняет порядок вставки.

пример.
Если вы вставляете ключи

1  3
5  9
4   6
7   15
3   10

он будет хранить его как

1  3
5  9
4   6
7   15
3   10

то же, что мы вставляем.

карта дерева хранит долины в порядке возрастания ключей. Образец.
Если ты ... вставка ключей

1  3
5  9
4   6
7   15
3   10

он будет хранить его как

1  3
3  10
4   6
5   9
7   15

все предлагают карту key - >value и способ перебора ключей. Самое важное различие между эти классы представляют собой временные гарантии и порядок ключей.

  1. HashMap предлагает 0 (1) поиск и вставку. Если вы перебираете ключи, хотя, порядок ключи по существу произвольны. Он реализуется массивом связанных списков.
  2. TreeMap предлагает поиск и вставку O(log N). Ключи упорядочены, поэтому, если вам нужно выполнить итерацию через ключи в отсортированном порядке, вы можете. Это означает, что ключи должны реализовать comparable интерфейс.TreeMap реализуется красно-черным деревом.
  3. LinkedHashMap предлагает 0 (1) поиск и вставку. Ключи упорядочены по порядку их вставки. Это реализован двусвязный ведра.

представьте, что вы передали пустую TreeMap, HashMap и LinkedHashMap в следующую функцию:

void insertAndPrint(AbstractMap<Integer, String> map) {
  int[] array= {1, -1, 0};
  for (int x : array) {
    map.put(x, Integer.toString(x));
  }
  for (int k: map.keySet()) {
   System.out.print(k + ", ");
  }
}

выходные данные для каждого будут выглядеть как результаты под.

для HashMap вывод был в моих собственных тестах { 0, 1, -1}, но это может быть любой порядок. Нет никакой гарантии на заказ.
Treemap, выход был,{ -1, 0, 1}
LinkedList, вывод был,{ 1, -1, 0}


  • HashMap:

    • порядок не поддерживает
    • быстрее, чем LinkedHashMap
    • используется для хранения кучи объектов
  • LinkedHashMap:

    • LinkedHashMap порядок вставки будет поддерживаться
    • медленнее, чем HashMap и быстрее, чем TreeMap
    • Если вы хотите сохранить порядок вставки, используйте этот.
  • TreeMap:

    • TreeMap-это древовидное отображение
    • TreeMap будет следовать естественному порядку ключа
    • медленнее, чем HashMap и LinkedHashMap
    • используйте TreeMap, когда вам нужно поддерживать естественный (по умолчанию) порядок

HashMap
может содержать один нулевой ключ.

HashMap не поддерживает порядок.

TreeMap

TreeMap не может содержать нулевого ключа.

TreeMap поддерживает порядок возрастания.

LinkedHashMap

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

примеры::

1) HashMap map = новый HashMap ();

    map.put(null, "Kamran");
    map.put(2, "Ali");
    map.put(5, "From");
    map.put(4, "Dir");`enter code here`
    map.put(3, "Lower");
    for (Map.Entry m : map.entrySet()) {
        System.out.println(m.getKey() + "  " + m.getValue());
    } 

2) Карта TreeMap = новая карта TreeMap ();

    map.put(1, "Kamran");
    map.put(2, "Ali");
    map.put(5, "From");
    map.put(4, "Dir");
    map.put(3, "Lower");
    for (Map.Entry m : map.entrySet()) {
        System.out.println(m.getKey() + "  " + m.getValue());
    }

3) LinkedHashMap map = новый LinkedHashMap ();

    map.put(1, "Kamran");
    map.put(2, "Ali");
    map.put(5, "From");
    map.put(4, "Dir");
    map.put(3, "Lower");
    for (Map.Entry m : map.entrySet()) {
        System.out.println(m.getKey() + "  " + m.getValue());
    }