Frage Unterschied zwischen HashMap, LinkedHashMap und TreeMap


Was ist der Unterschied zwischen HashMap, LinkedHashMap und TreeMap in Java? Ich sehe keinen Unterschied in der Ausgabe, wie alle drei keySet und values. Was sind 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());

816
2018-05-22 21:10


Ursprung


Antworten:


Alle drei Klassen implementieren die Map Schnittstelle und bieten meist die gleiche Funktionalität. Der wichtigste Unterschied ist die Reihenfolge, in der die Iteration durch die Einträge erfolgt:

  • HashMap macht absolut keine Garantien über die Iterationsreihenfolge. Es kann (und wird) sich sogar komplett ändern, wenn neue Elemente hinzugefügt werden.
  • TreeMap wird gemäß der "natürlichen Ordnung" der Schlüssel iterieren entsprechend ihrer compareTo() Methode (oder eine extern gelieferte Comparator). Zusätzlich implementiert es die SortedMap Schnittstelle, die Methoden enthält, die von dieser Sortierreihenfolge abhängen.
  • LinkedHashMap wird in der Reihenfolge durchlaufen, in der die Einträge in die Karte eingefügt wurden

"Hash-tabelle" ist der generische Name für Hash-basierte Karten. Im Kontext der Java-API Hashtable ist eine veraltete Klasse aus den Tagen von Java 1.1, bevor das Collections-Framework existierte. Es sollte nicht mehr verwendet werden, da seine API mit veralteten Methoden, die die Funktionalität duplizieren, überladen ist und ihre Methoden synchronisiert sind (was die Leistung verringern kann und im Allgemeinen nutzlos ist). Benutzen GleichzeitigeHashMap anstelle von Hashtable.


1019
2018-05-22 21:18



Ich bevorzuge visuelle Präsentation:

╔══════════════╦═════════════════════╦═══════════════════╦═════════════════════╗
║   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               ║
╚══════════════╩═══════════════════════════════════════════════════════════════╝

1383
2017-07-17 19:24



Alle drei repräsentieren die Zuordnung von eindeutigen Schlüsseln zu Werten und implementieren daher die Karte Schnittstelle.

  1. HashMap ist eine Karte basierend auf Hashing der Schlüssel. Es unterstützt O (1) get / put Operationen. Schlüssel müssen haben konsistente Implementierungen von hashCode() und equals() damit dies funktioniert.

  2. LinkedHashMap ist HashMap sehr ähnlich, aber es erhöht die Aufmerksamkeit für die Reihenfolge, in der Elemente hinzugefügt werden (oder auf die zugegriffen wird). Daher entspricht die Iterationsreihenfolge der Einfügereihenfolge (oder der Zugriffsreihenfolge, abhängig von den Konstruktionsparametern).

  3. TreeMap ist ein baumbasiertes Mapping. Seine Put / Get-Operationen benötigen O (log n) -Zeit. Es erfordert, dass Elemente einen Vergleichsmechanismus haben, entweder mit Comparable oder Comparator. Die Iterationsreihenfolge wird durch diesen Mechanismus bestimmt.


60
2018-05-22 21:17



Sehen Sie im folgenden Diagramm nach, wo sich jede Klasse in der Klassenhierarchie befindet (ein größerer). TreeMap implementiert SortedMap und NavigableMap während HashMap nicht.

HashTable ist veraltet und das entsprechende ConcurrentHashMap Klasse sollte verwendet werden. enter image description here


37
2018-01-30 02:28



Nur ein wenig mehr Input aus meiner eigenen Erfahrung mit Karten, wann ich sie benutzen würde:

  • HashMap - Am nützlichsten bei der Suche nach einer (schnellen) Best-Performance-Implementierung.
  • TreeMap (SortedMap-Schnittstelle) - Am nützlichsten, wenn ich in der Lage bin, die Schlüssel in einer bestimmten von mir definierten Reihenfolge zu sortieren oder zu iterieren.
  • LinkedHashMap - Kombiniert Vorteile der garantierten Bestellung von TreeMap ohne die erhöhten Kosten für die Pflege der TreeMap. (Es ist fast so schnell wie die HashMap). Insbesondere bietet die LinkedHashMap auch einen guten Ausgangspunkt zum Erstellen eines Cache-Objekts durch Überschreiben der removeEldestEntry()Methode. Auf diese Weise können Sie ein Cache-Objekt erstellen, das Daten anhand bestimmter von Ihnen definierter Kriterien ablaufen lässt.

35
2017-08-27 18:51



HashMap

  • Es hat Paarwerte (Schlüssel, Werte)
  • KEINE Duplikationsschlüsselwerte
  • ungeordnet unsortiert
  • Es erlaubt einen Null-Schlüssel und mehrere Null-Werte

Hash-tabelle

  • Gleich wie Hash-Karte
  • Es erlaubt keine Null-Schlüssel und Null-Werte

LinkedHashMap

  • Es ist eine geordnete Version der Kartenimplementierung
  • Basierend auf verknüpften Listen- und Hashing-Datenstrukturen

Baumkarte

  • Bestellte und sortierte Version
  • basierend auf Hashing-Datenstrukturen

34
2017-10-18 04:55



Alle drei Klassen HashMap, TreeMap und LinkedHashMap implementiert java.util.Map Schnittstelle und stellt die Zuordnung von einem eindeutigen Schlüssel zu Werten dar.

HashMap

  1. EIN HashMap enthält Werte basierend auf dem Schlüssel.

  2. Es enthält nur einzigartige Elemente.

  3. Es kann einen Nullschlüssel und mehrere Nullwerte haben.

  4. Es behält bei keine Bestellung.

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

LinkedHashMap

  1. EIN LinkedHashMap enthält Werte basierend auf dem Schlüssel.
  2. Es enthält nur einzigartige Elemente.
  3. Es kann einen Nullschlüssel und mehrere Nullwerte haben.
  4. Es ist dasselbe wie HashMap stattdessen verwaltet Anzeigenauftrag. // Siehe Klassenverzögerung unten

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

Baumkarte

  1. EIN TreeMap enthält Werte basierend auf dem Schlüssel. Es implementiert die NavigableMap-Schnittstelle und erweitert die AbstractMap-Klasse.
  2. Es enthält nur einzigartige Elemente.
  3. Es kann keinen Null-Schlüssel haben, aber mehrere Null-Werte haben.
  4. Es ist dasselbe wie HashMap behält stattdessen bei aufsteigende Reihenfolge(Sortiert mit der natürlichen Reihenfolge seines Schlüssels.).

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

Hash-tabelle

  1. Ein Hashtable ist ein Array von Listen. Jede Liste wird als Bucket bezeichnet. Die Position des Buckets wird durch Aufrufen der Methode hashcode () ermittelt. Eine Hashtabelle enthält Werte basierend auf dem Schlüssel.
  2. Es enthält nur einzigartige Elemente.
  3. Es darf keinen Nullschlüssel oder -wert haben.
  4. Es ist synchronisiert.
  5. Es ist eine Legacy-Klasse.

    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


15
2018-05-05 05:28