Frage Unterschiede zwischen HashMap und Hashtable?


Was sind die Unterschiede zwischen a HashMap und ein Hashtable in Java?

Was ist effizienter für Anwendungen ohne Threading?


3113
2017-09-02 20:12


Ursprung


Antworten:


Es gibt einige Unterschiede zwischen HashMap und Hashtable in Java:

  1. Hashtable ist synchronisiert, wohingegen HashMap ist nicht. Das macht HashMap besser für Anwendungen ohne Threads, da unsynchronisierte Objekte normalerweise besser abschneiden als synchronisierte.

  2. Hashtable erlaubt nicht null Schlüssel oder Werte. HashMap erlaubt eins null Schlüssel und eine beliebige Anzahl von null Werte.

  3. Eine der Unterklassen von HashMap ist LinkedHashMapFür den Fall, dass Sie eine vorhersagbare Iterationsreihenfolge wünschen (was standardmäßig die Einfügereihenfolge ist), können Sie die HashMap Für ein LinkedHashMap. Das wäre nicht so einfach, wenn Sie es benutzen würden Hashtable.

Da Synchronisation für Sie kein Problem ist, würde ich empfehlen HashMap. Wenn die Synchronisierung zu einem Problem wird, können Sie sich das auch ansehen ConcurrentHashMap.


3203
2017-09-02 23:02



Beachten Sie, dass viele Antworten darauf hinweisen, dass Hashtable synchronisiert ist. In der Praxis kauft das sehr wenig.  Die Synchronisierung der Accessor / Mutator-Methoden verhindert, dass zwei Threads gleichzeitig hinzugefügt oder entfernt werden. In der realen Welt benötigen Sie jedoch häufig eine zusätzliche Synchronisation.

Ein sehr gebräuchliches Idiom ist es, zu "checken und dann zu setzen" - d. H. Nach einem Eintrag in der Karte zu suchen und es hinzuzufügen, wenn es nicht bereits existiert. Dies ist in keiner Weise eine atomare Operation, ob Sie Hashtable oder HashMap verwenden.

Eine äquivalent synchronisierte HashMap kann erhalten werden durch:

Collections.synchronizedMap(myMap);

Aber um diese Logik richtig umzusetzen, brauchen Sie zusätzliche Synchronisation der Form:

synchronized(myMap) {
    if (!myMap.containsKey("tomato"))
        myMap.put("tomato", "red");
}

Sogar das Iterieren über Hashtable-Einträge (oder eine HashMap, die von Collections.synchronizedMap erhalten wird) ist nicht threadsicher, es sei denn, Sie verhindern auch, dass die Map durch zusätzliche Synchronisation geändert wird.

Implementierungen des GleichzeitigeMap Schnittstelle (zum Beispiel GleichzeitigeHashMap) Lösen Sie etwas davon, indem Sie einschließen thread-sichere check-then-act-Semantik sowie:

ConcurrentMap.putIfAbsent(key, value);

580
2017-09-03 11:00



Niemand hat die Tatsache erwähnt, dass Hashtable ist nicht Teil des Java Collections Framework - es bietet nur eine ähnliche API. Ebenfalls, Hashtable gilt als Legacy-Code. Da ist nichts Hashtable das kann nicht mit verwendet werden HashMap oder Ableitungen von HashMapFür neuen Code sehe ich keine Rechtfertigung, zu der ich zurückgehen könnte Hashtable.


287
2018-06-25 01:46



Diese Frage wird häufig im Interview gestellt, um zu prüfen, ob der Kandidat die korrekte Verwendung von Sammlungsklassen versteht und welche alternativen Lösungen verfügbar sind.

  1. Die HashMap-Klasse entspricht in etwa Hashtable, außer dass sie nicht synchronisiert ist und Nullen zulässt. (HashMap erlaubt Nullwerte als Schlüssel und Wert, während Hashtable Nullen nicht erlaubt).
  2. HashMap garantiert nicht, dass die Reihenfolge der Karten im Laufe der Zeit konstant bleibt.
  3. HashMap ist nicht synchronisiert, während Hashtable synchronisiert ist.
  4. Iterator in der HashMap ist fehlersicher, während der Enumerator für die Hashtabelle nicht aktiv ist, und wirft ConcurrentModificationException, wenn ein anderer Thread die Map strukturell ändert, indem er Elemente mit Ausnahme der eigenen Methode remove () von Iterator hinzufügt oder entfernt. Dies ist jedoch kein garantiertes Verhalten und wird von JVM nach besten Kräften durchgeführt.

Hinweis zu einigen wichtigen Bedingungen

  1. Synchronisiert bedeutet, dass nur ein Thread eine Hash-Tabelle zu einem Zeitpunkt ändern kann. Grundsätzlich bedeutet dies, dass alle Threads, bevor ein Update für eine Hashtabelle durchgeführt wird, eine Sperre für das Objekt anfordern müssen, während andere darauf warten, dass die Sperre aufgehoben wird.
  2. Fail-safe ist relevant im Kontext von Iteratoren. Wenn ein Iterator für ein Auflistungsobjekt erstellt wurde und ein anderer Thread versucht, das Auflistungsobjekt "strukturell" zu ändern, wird eine Ausnahme für gleichzeitige Änderungen ausgelöst. Es ist jedoch möglich, dass andere Threads die Methode "set" aufrufen, da sie die Auflistung nicht "strukturell" ändert. Wenn jedoch vor dem Aufruf von "set" die Auflistung strukturell geändert wurde, wird "IllegalArgumentException" ausgelöst.
  3. Strukturelle Modifikation bedeutet Löschen oder Einfügen eines Elements, das die Struktur der Karte effektiv verändern könnte.

HashMap kann mit synchronisiert werden

Map m = Collections.synchronizeMap(hashMap);

Map bietet Collection-Ansichten anstelle von direkter Iterationsunterstützung  über Enumerationsobjekte. Sammlungsansichten verbessern die  Ausdruckskraft der Schnittstelle, wie später in diesem Abschnitt diskutiert.  Map ermöglicht Ihnen, über Schlüssel, Werte oder Schlüssel / Wert-Paare zu iterieren;  Hashtable bietet nicht die dritte Option. Karte bietet einen sicheren Weg  um Einträge mitten in der Iteration zu entfernen; Hashtable nicht.  Schließlich behebt Map einen kleinen Mangel in der Hashtable-Schnittstelle.  Hashtable hat eine Methode namens contains, die true zurückgibt, wenn der  Hashtable enthält einen bestimmten Wert. Angesichts seines Namens würden Sie das erwarten  Methode, um wahr zurückzugeben, wenn die Hashtable einen bestimmten Schlüssel enthielt, weil  Der Schlüssel ist der primäre Zugriffsmechanismus für eine Hashtable. Die Karte  Interface beseitigt diese Quelle der Verwirrung durch Umbenennen der Methode  containsValue. Dies verbessert auch die Konsistenz der Schnittstelle -  containsValue-Parallelen containsKey.

Die Kartenschnittstelle


148
2017-10-04 06:39



HashMap: Eine Implementierung der Map Schnittstelle, die Hash-Codes verwendet, um ein Array zu indexieren. Hashtable: Hallo, 1998 angerufen. Sie möchten ihre Collections API zurück.

Aber im Ernst, du solltest besser wegbleiben Hashtable insgesamt. Für Singlethread-Anwendungen benötigen Sie keinen zusätzlichen Aufwand für die Synchronisierung. Bei hochgradig parallelen Anwendungen kann die paranoide Synchronisierung zu einem Verhungern, Deadlocks oder unnötigen Garbage-Collection-Pausen führen. Wie Tim Howland darauf hingewiesen hat, könnten Sie es verwenden ConcurrentHashMap stattdessen.


107
2017-09-02 23:14



Denk daran, dass HashTable war Legacy - Klasse, bevor Java Collections Framework (JCF) eingeführt wurde und später nachgerüstet wurde, um die Map Schnittstelle. So war Vector und Stack.

Bleiben Sie deshalb immer in neuem Code von ihnen fern, da es in der JCF immer eine bessere Alternative gibtwie andere darauf hingewiesen hatten.

Hier ist das Java-Sammlung-Spickzettel das wirst du nützlich finden. Beachten Sie, dass der graue Block die Legacy-Klasse HashTable, Vector und Stack enthält.

enter image description here


104
2018-03-25 08:58



Zusätzlich zu dem, was Izb gesagt hat, HashMap erlaubt Nullwerte, während der Hashtable nicht.

Beachten Sie auch das Hashtable erweitert die Dictionary Klasse, die als die Javadocs Staat, ist veraltet und wurde durch die ersetzt Map Schnittstelle.


58
2017-09-02 20:30



Schau dir diese Tabelle an. Es bietet Vergleiche zwischen verschiedenen Datenstrukturen zusammen mit HashMap und Hashtable. Der Vergleich ist präzise, ​​klar und leicht verständlich.

Java-Sammlungsmatrix


50
2017-11-20 05:35



Hashtable ist ähnlich wie die HashMap und hat eine ähnliche Schnittstelle. Es wird empfohlen, dass Sie verwenden HashMap, es sei denn, Sie benötigen Unterstützung für Legacy-Anwendungen oder Sie benötigen eine Synchronisierung, wie z Hashtables Methoden werden synchronisiert. Also in Ihrem Fall, da Sie nicht Multi-Threading sind, HashMaps sind deine beste Wette.


39
2017-09-02 20:25



Ein weiterer wichtiger Unterschied zwischen Hashtabelle und Hashmap ist, dass Iterator in der HashMap fehlgeschlagen ist, während der Enumerator für die Hashtabelle nicht vorhanden ist und ConcurrentModificationException ausgelöst wird, wenn ein anderer Thread die Map strukturell durch Hinzufügen oder Entfernen von Elementen außer Iterators eigener remove () -Methode ändert. Dies ist jedoch kein garantiertes Verhalten und wird von JVM nach besten Kräften durchgeführt. "

Meine Quelle: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html


31
2017-09-08 06:40