Was sind die Unterschiede zwischen a HashMap
und a Hashtable
in Java?
Was ist für Anwendungen ohne Thread effizienter?
java
collections
hashmap
hashtable
dmanxiii
quelle
quelle
ConcurrentMap
ist hier nicht erforderlich, da in der Frage "Anwendungen ohne Thread" angegeben ist, was bedeutet, dass Threading / Parallelität kein Problem darstellt.Antworten:
Es gibt verschiedene Unterschiede zwischen
HashMap
undHashtable
in Java:Hashtable
ist synchronisiert , während diesHashMap
nicht der Fall ist. Dies istHashMap
besser für Anwendungen ohne Thread, da nicht synchronisierte Objekte in der Regel eine bessere Leistung erzielen als synchronisierte.Hashtable
erlaubt keinenull
Schlüssel oder Werte.HashMap
erlaubt einennull
Schlüssel und eine beliebige Anzahl vonnull
Werten.Einer von HashMap der Subklassen ist
LinkedHashMap
, so in dem Fall , dass Sie vorhersehbar Iterationsreihenfolge wollen würden (der Auftrag standardmäßig ist), können Sie die Swap leichtHashMap
für einLinkedHashMap
. Dies wäre nicht so einfach, wenn Sie verwenden würdenHashtable
.Da die Synchronisierung für Sie kein Problem darstellt, würde ich empfehlen
HashMap
. Wenn die Synchronisierung zu einem Problem wird, können Sie dies auch überprüfenConcurrentHashMap
.quelle
Collections.synchronizedMap()
.Hashtable
("Das Synchronisieren jeder Methode sollte sich um alle Parallelitätsprobleme kümmern!") Es für Thread-Anwendungen sehr viel schlimmer macht . Sie sind besser dran, eine extern zu synchronisierenHashMap
(und über die Konsequenzen nachzudenken) oder eineConcurrentMap
Implementierung zu verwenden (und ihre erweiterte API für die Parallelität zu nutzen). Fazit: Der einzige Grund für die VerwendungHashtable
ist, wenn eine Legacy-API (ab ca. 1996) dies erfordert.Beachten Sie, dass in vielen Antworten angegeben ist, dass Hashtable synchronisiert ist. In der Praxis kauft Ihnen das sehr wenig. Die Synchronisierung erfolgt über die Accessor / Mutator-Methoden. Es werden zwei Threads gestoppt, die gleichzeitig zur Karte hinzugefügt oder daraus entfernt werden. In der realen Welt ist jedoch häufig eine zusätzliche Synchronisierung erforderlich.
Eine sehr gebräuchliche Redewendung ist "check then put" - dh suchen Sie nach einem Eintrag in der
Map
und fügen Sie ihn hinzu, falls er noch nicht vorhanden ist. Dies ist in keiner Weise eine atomare Operation, egal ob SieHashtable
oder verwendenHashMap
.Eine äquivalent synchronisierte
HashMap
kann erhalten werden durch:Um diese Logik korrekt zu implementieren, benötigen Sie jedoch eine zusätzliche Synchronisierung des Formulars:
Selbst das Iterieren über
Hashtable
die Einträge eines (oder einesHashMap
vonCollections.synchronizedMap
) ist nicht threadsicher, es sei denn, Sie verhindern auch, dass dasMap
durch zusätzliche Synchronisierung geändert wird.Implementierungen der
ConcurrentMap
Schnittstelle (zum BeispielConcurrentHashMap
) lösen einige dieser Probleme, indem sie eine thread-sichere Check-Then-Act-Semantik enthalten, wie z.quelle
Hashtable
wird als Legacy-Code betrachtet. Es gibt nichtsHashtable
, was nicht mitHashMap
oder Ableitungen von getan werden kannHashMap
, daher sehe ich für neuen Code keine Rechtfertigung für die Rückkehr zuHashtable
.quelle
Diese Frage wird häufig im Interview gestellt, um zu überprüfen, ob der Kandidat die korrekte Verwendung von Sammlungsklassen versteht und sich der verfügbaren alternativen Lösungen bewusst ist.
HashMap
Klasse entspricht in etwaHashtable
, außer dass sie nicht synchronisiert ist und Nullen zulässt. (HashMap
erlaubt Nullwerte als Schlüssel und Wert, während sHashtable
nicht erlaubt istnull
).HashMap
garantiert nicht, dass die Reihenfolge der Karte über die Zeit konstant bleibt.HashMap
ist nicht synchronisiert, währendHashtable
synchronisiert ist.HashMap
ist ausfallsicher, während der Enumerator fürHashtable
is nicht ist, und wird ausgelöst,ConcurrentModificationException
wenn ein anderer Thread die Map strukturell ändert, indem er ein Element außerIterator
der eigenenremove()
Methode hinzufügt oder entfernt . Dies ist jedoch kein garantiertes Verhalten und wird von JVM nach besten Kräften durchgeführt.Hinweis zu einigen wichtigen Begriffen:
Hashtable
, eine Sperre für das Objekt erhalten muss, während andere darauf warten, dass die Sperre aufgehoben wird.set
Methode aufrufen , da die Sammlung nicht "strukturell" geändert wird. Wennset
die Sammlung jedoch vor dem Aufruf strukturell geändert wurde,IllegalArgumentException
wird sie ausgelöst.HashMap
kann synchronisiert werden durchMap m = Collections.synchronizeMap(hashMap);
Map bietet Sammlungsansichten anstelle der direkten Unterstützung für die Iteration über Aufzählungsobjekte. Sammlungsansichten verbessern die Ausdruckskraft der Benutzeroberfläche erheblich, wie später in diesem Abschnitt erläutert wird. Mit Map können Sie Schlüssel, Werte oder Schlüssel-Wert-Paare durchlaufen.
Hashtable
bietet nicht die dritte Option. Map bietet eine sichere Möglichkeit, Einträge während der Iteration zu entfernen.Hashtable
nicht. Schließlich behebt Map einen kleinen Mangel in derHashtable
Benutzeroberfläche.Hashtable
hat eine Methode namens enthält, die true zurückgibt, wenn dieHashtable
einen bestimmten Wert enthält. Angesichts seines Namens würde man erwarten, dass diese Methode true zurückgibt, wennHashtable
sie einen bestimmten Schlüssel enthält, da der Schlüssel der primäre Zugriffsmechanismus für a istHashtable
. Die Map-Oberfläche beseitigt diese Verwirrung durch Umbenennen der MethodecontainsValue
. Dies verbessert auch die Konsistenz der Schnittstelle -containsValue
ParallelencontainsKey
.quelle
set
Operation an aHashMap
. 3) Dieput(...)
Operation wird nicht ausgelöst,IllegalArgumentException
wenn zuvor eine Änderung vorgenommen wurde. 4) Das Fail-Fast-Verhalten von trittHashMap
auch auf, wenn Sie eine Zuordnung ändern. 5) Das Fail-Fast-Verhalten ist garantiert. (Was nicht garantiert ist, ist das Verhalten von a,HashTable
wenn Sie eine gleichzeitige Änderung vornehmen. Das tatsächliche Verhalten ist ... unvorhersehbar.)Hashtable
garantiert nicht, dass die Reihenfolge der Kartenelemente auch über die Zeit stabil bleibt. (Sie verwechseln vielleichtHashtable
mitLinkedHashMap
.)thing.set(thing.get() + 1);
das häufiger als nicht Neulinge überrascht als völlig ungeschützt fängt, vor allem , wenn dieget()
undset()
Methoden synchronisiert werden . Viele von ihnen erwarten Magie.HashMap
: Eine Implementierung derMap
Schnittstelle, die Hash-Codes verwendet, um ein Array zu indizieren.Hashtable
: Hallo, 1998 angerufen. Sie möchten ihre Sammlungs-API zurück.Im Ernst, du bist besser dran, dich von allem fernzuhalten
Hashtable
. Für Single-Threaded-Apps benötigen Sie keinen zusätzlichen Aufwand für die Synchronisierung. Bei Apps mit hoher Gleichzeitigkeit kann die paranoide Synchronisierung zu Hunger, Deadlocks oder unnötigen Pausen bei der Speicherbereinigung führen. Wie Tim Howland betonte, könnten SieConcurrentHashMap
stattdessen verwenden.quelle
Beachten Sie, dass dies
HashTable
eine Legacy-Klasse war, bevor Java Collections Framework (JCF) eingeführt und später zur Implementierung derMap
Schnittstelle nachgerüstet wurde . So warVector
undStack
.Halten Sie sich daher in neuem Code immer von ihnen fern, da es in der JCF immer eine bessere Alternative gibt, wie andere betont hatten.
Hier ist der Spickzettel der Java-Sammlung , den Sie nützlich finden. Beachten Sie, dass der graue Block die Legacy-Klassen HashTable, Vector und Stack enthält.
quelle
Es gibt bereits viele gute Antworten. Ich füge einige neue Punkte hinzu und fasse sie zusammen.
HashMap
undHashtable
beide werden verwendet, um Daten in Schlüssel- und Wertform zu speichern . Beide verwenden die Hashing-Technik, um eindeutige Schlüssel zu speichern. Es gibt jedoch viele Unterschiede zwischen den unten angegebenen HashMap- und Hashtable-Klassen.HashMap
HashMap
ist nicht synchronisiert. Es ist nicht threadsicher und kann ohne richtigen Synchronisationscode nicht von vielen Threads gemeinsam genutzt werden.HashMap
erlaubt einen Nullschlüssel und mehrere Nullwerte.HashMap
ist eine neue Klasse, die in JDK 1.2 eingeführt wurde.HashMap
ist schnell.HashMap
als synchronisieren, indem wir diesen Code aufrufenMap m = Collections.synchronizedMap(HashMap);
HashMap
wird von Iterator durchquert.HashMap
ist ausfallsicher.HashMap
erbt die AbstractMap-Klasse.Hash-tabelle
Hashtable
ist synchronisiert. Es ist threadsicher und kann mit vielen Threads geteilt werden.Hashtable
erlaubt keinen Nullschlüssel oder Wert.Hashtable
ist eine Legacy-Klasse.Hashtable
ist langsam.Hashtable
ist intern synchronisiert und kann nicht unsynchronisiert werden.Hashtable
wird von Enumerator und Iterator durchlaufen.Hashtable
ist nicht ausfallsicher.Hashtable
erbt die Dictionary-Klasse.Lesen Sie weiter Was ist der Unterschied zwischen HashMap und Hashtable in Java?
quelle
Zusätzlich zu dem, was izb gesagt hat, sind
HashMap
Nullwerte zulässig , währendHashtable
dies nicht der Fall ist.Beachten Sie auch, dass
Hashtable
dieDictionary
Klasse erweitert wird, die als Javadocs- Status veraltet ist und durch dieMap
Schnittstelle ersetzt wurde.quelle
Schauen Sie sich diese Tabelle an. Es bietet Vergleiche zwischen verschiedenen Datenstrukturen zusammen mit
HashMap
undHashtable
. Der Vergleich ist präzise, klar und leicht verständlich.Java-Sammlungsmatrix
quelle
Hashtable
ist ähnlich wieHashMap
und hat eine ähnliche Schnittstelle. Es wird empfohlen, dass Sie verwendenHashMap
, es sei denn, Sie benötigen Unterstützung für ältere Anwendungen oder Sie benötigen eine Synchronisierung, da dieHashtables
Methoden synchronisiert sind. In Ihrem FallHashMaps
sind Sie also die beste Wahl, da Sie kein Multithreading betreiben .quelle
Ein weiterer wesentlicher Unterschied zwischen Hashtable und Hashmap besteht darin, dass der Iterator in der HashMap ausfallsicher ist, während der Enumerator für die Hashtable nicht ausfällt, und ConcurrentModificationException auslöst, wenn ein anderer Thread die Map strukturell ändert, indem er ein Element außer Iterators eigener remove () -Methode strukturell ändert oder entfernt. 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
quelle
Neben all den anderen wichtigen Aspekten, die hier bereits erwähnt wurden, wird die Sammlungs-API (z. B. Kartenschnittstelle) ständig geändert, um den "neuesten und größten" Ergänzungen der Java-Spezifikation zu entsprechen.
Vergleichen Sie beispielsweise die Java 5 Map-Iteration:
im Vergleich zum alten Hashtable-Ansatz:
In Java 1.8 wird uns auch versprochen, HashMaps wie in guten alten Skriptsprachen erstellen und darauf zugreifen zu können:
Update: Nein, sie werden nicht in 1.8 landen ... :(
Werden die Sammlungsverbesserungen von Project Coin in JDK8 enthalten sein?
quelle
Hashtable
ist synchronisiert, wohingegenHashMap
nicht. Das machtHashtable
langsamer alsHashmap
.Verwenden
HashMap
Sie Apps ohne Thread, da sie ansonsten hinsichtlich der Funktionalität identisch sind.quelle
HashTable ist synchronisiert. Wenn Sie es in einem einzelnen Thread verwenden, können Sie HashMap verwenden , eine nicht synchronisierte Version. Nicht synchronisierte Objekte sind oft etwas leistungsfähiger. Übrigens, wenn mehrere Threads gleichzeitig auf eine HashMap zugreifen und mindestens einer der Threads die Map strukturell ändert, muss sie extern synchronisiert werden. Sie können eine nicht synchronisierte Karte in eine synchronisierte umschließen, indem Sie Folgendes verwenden:
HashTable kann nur Nicht-Null-Objekte als Schlüssel oder als Wert enthalten. HashMap kann einen Nullschlüssel und Nullwerte enthalten.
Die von Map zurückgegebenen Iteratoren sind ausfallsicher, wenn die Map zu irgendeinem Zeitpunkt nach dem Erstellen des Iterators strukturell geändert wird, außer durch die eigene Entfernungsmethode des Iterators
ConcurrentModificationException
. Der Iterator löst a aus . Daher fällt der Iterator angesichts gleichzeitiger Änderungen schnell und sauber aus, anstatt zu einem unbestimmten Zeitpunkt in der Zukunft willkürliches, nicht deterministisches Verhalten zu riskieren. Während die von den Schlüssel- und Elementmethoden von Hashtable zurückgegebenen Aufzählungen nicht ausfallsicher sind.HashTable und HashMap sind Mitglied des Java Collections Framework (seit der Java 2-Plattform v1.2 wurde HashTable zur Implementierung der Map-Schnittstelle nachgerüstet).
HashTable wird als Legacy-Code betrachtet. In der Dokumentation wird empfohlen, ConcurrentHashMap anstelle von Hashtable zu verwenden, wenn eine thread-sichere, hochkonkurrierende Implementierung gewünscht wird.
HashMap garantiert nicht die Reihenfolge, in der Elemente zurückgegeben werden. Für HashTable ist es wahrscheinlich dasselbe, aber ich bin mir nicht ganz sicher, ich finde keine Ressource, die dies eindeutig angibt.
quelle
HashMap
undHashtable
haben auch signifikante algorithmische Unterschiede. Niemand hat dies zuvor erwähnt, deshalb spreche ich es an.HashMap
erstellt eine Hash-Tabelle mit einer Potenz von zwei Größen, erhöht sie dynamisch so, dass sich höchstens acht Elemente (Kollisionen) in einem Bucket befinden, und rührt die Elemente für allgemeine Elementtypen sehr gut um. DieHashtable
Implementierung bietet jedoch eine bessere und feinere Kontrolle über das Hashing, wenn Sie wissen, was Sie tun. Sie können die Tabellengröße beispielsweise anhand der Primzahl festlegen, die Ihrer Wertedomänengröße am nächsten kommt. Dies führt zu einer besseren Leistung als HashMap, dh weniger Kollisionen für einige Fälle.Abgesehen von den offensichtlichen Unterschieden, die in dieser Frage ausführlich erörtert werden, sehe ich den Hashtable als Auto mit "manuellem Antrieb", bei dem Sie eine bessere Kontrolle über das Hashing haben, und die HashMap als Gegenstück mit "automatischem Antrieb", das im Allgemeinen eine gute Leistung erbringt.
quelle
Aufgrund der Informationen hier würde ich empfehlen, mit HashMap zu arbeiten. Ich denke, der größte Vorteil ist, dass Java Sie daran hindert, es zu ändern, während Sie darüber iterieren, es sei denn, Sie tun dies über den Iterator.
quelle
A
Collection
- manchmal auch Container genannt - ist einfach ein Objekt, das mehrere Elemente zu einer Einheit zusammenfasst.Collection
s werden zum Speichern, Abrufen, Bearbeiten und Kommunizieren aggregierter Daten verwendet. Ein Sammlungsframework W ist eine einheitliche Architektur zum Darstellen und Bearbeiten von Sammlungen.Die
HashMap
JDK1.2
und die HashtabelleJDK1.0
werden beide verwendet, um eine Gruppe von Objekten darzustellen, die<Key, Value>
paarweise dargestellt werden. Jedes<Key, Value>
Paar heißtEntry
Objekt. Die Sammlung von Einträgen wird durch den Gegenstand vonHashMap
und bezeichnetHashtable
. Schlüssel in einer Sammlung müssen eindeutig oder unverwechselbar sein. [da sie verwendet werden, um einen zugeordneten Wert eines bestimmten Schlüssels abzurufen. Werte in einer Sammlung können dupliziert werden.]« Mitglied des Superclass, Legacy and Collection Framework
Hashtable ist eine in eingeführte Legacy-Klasse
JDK1.0
, die eine Unterklasse der Dictionary-Klasse ist. FromJDK1.2
Hashtable wurde überarbeitet, um die Map-Schnittstelle zu implementieren und Mitglied des Collection-Frameworks zu werden. HashMap ist seit Beginn seiner Einführung in Java Collection Framework MitgliedJDK1.2
. HashMap ist die Unterklasse der AbstractMap-Klasse.« Anfangskapazität und Lastfaktor
Die Kapazität ist die Anzahl der Buckets in der Hash-Tabelle, und die anfängliche Kapazität ist einfach die Kapazität zum Zeitpunkt der Erstellung der Hash-Tabelle. Beachten Sie, dass die Hash-Tabelle geöffnet ist: Im Fall eines "
hash
collision
" speichert ein einzelner Bucket mehrere Einträge, die nacheinander durchsucht werden müssen. Der Auslastungsfaktor ist ein Maß dafür, wie voll die Hash-Tabelle werden darf, bevor ihre Kapazität automatisch erhöht wird.HashMap erstellt eine leere Hash-Tabelle mit der Standard-Anfangskapazität (16) und dem Standard-Ladefaktor (0,75). Wobei als Hashtable eine leere Hashtable mit einer Standard-Anfangskapazität (11) und einem Lastfaktor / Füll-Verhältnis (0,75) erstellt wird.
« Strukturänderung bei Hash-Kollision
HashMap
,Hashtable
Bei Hash - Kollisionen sie speichern die Map - Einträge in verknüpften Listen. Wenn in Java8 derHashMap
Hash-Bucket einen bestimmten Schwellenwert überschreitet, wechselt dieser Bucket vonlinked list of entries to a balanced tree
. die die Worst-Case-Leistung von O (n) auf O (log n) verbessern. Beim Konvertieren der Liste in einen Binärbaum wird Hashcode als Verzweigungsvariable verwendet. Wenn sich zwei verschiedene Hashcodes im selben Bucket befinden, wird einer als größer angesehen und befindet sich rechts vom Baum und der andere links. Wenn jedoch beide Hashcodes gleich sind, wirdHashMap
davon ausgegangen, dass die Schlüssel vergleichbar sind, und der Schlüssel wird verglichen, um die Richtung zu bestimmen, damit eine bestimmte Reihenfolge beibehalten werden kann. Es ist eine gute Praxis, die SchlüsselHashMap
vergleichbar zu machen . Beim Hinzufügen von Einträgen, wenn die Bucket-Größe erreicht istTREEIFY_THRESHOLD = 8
Konvertieren Sie die verknüpfte Liste von Einträgen in einen ausgeglichenen Baum. Wenn Sie Einträge entfernen, die kleiner alsTREEIFY_THRESHOLD
und höchstens sind,UNTREEIFY_THRESHOLD = 6
wird der ausgeglichene Baum wieder in eine verknüpfte Liste von Einträgen konvertiert . Java 8 SRC , Stackpost« Iteration der Sammlungsansicht, ausfallsicher und ausfallsicher
Iterator
ist ein Fail-Fast in der Natur. Das heißt, es wird eine ConcurrentModificationException ausgelöst, wenn eine Sammlung geändert wird, während eine andere als die eigene remove () -Methode iteriert wird. Wo wieEnumeration
in der Natur ausfallsicher ist. Es werden keine Ausnahmen ausgelöst, wenn eine Sammlung während der Iteration geändert wird.Laut Java API Docs wird Iterator immer der Aufzählung vorgezogen.
HINWEIS: Die Funktionalität der Enumeration-Schnittstelle wird von der Iterator-Schnittstelle dupliziert. Darüber hinaus fügt Iterator eine optionale Entfernungsoperation hinzu und verfügt über kürzere Methodennamen. Neue Implementierungen sollten die Verwendung von Iterator anstelle von Enumeration in Betracht ziehen.
In Java 5 wurde die ConcurrentMap-Schnittstelle eingeführt :
ConcurrentHashMap
- Eine hochkonkurrierende, leistungsstarkeConcurrentMap
Implementierung, die von einer Hash-Tabelle unterstützt wird. Diese Implementierung wird beim Abrufen niemals blockiert und ermöglicht es dem Client, die Parallelitätsstufe für Aktualisierungen auszuwählen. Es ist als Ersatz für Folgendes gedachtHashtable
: Zusätzlich zur ImplementierungConcurrentMap
unterstützt es alle "Legacy" -Methoden, die es gibtHashtable
.Jeder
HashMapEntry
s-Wert ist flüchtig, wodurch eine feine Kornkonsistenz für konkurrierende Modifikationen und nachfolgende Lesevorgänge sichergestellt wird. Jeder Lesevorgang spiegelt das zuletzt abgeschlossene Update widerIteratoren und Aufzählungen sind ausfallsicher - spiegeln den Status zu einem bestimmten Zeitpunkt seit der Erstellung des Iterators / der Aufzählung wider. Dies ermöglicht gleichzeitiges Lesen und Ändern auf Kosten einer verringerten Konsistenz. Sie lösen keine ConcurrentModificationException aus. Iteratoren können jedoch jeweils nur von einem Thread verwendet werden.
Wie,
Hashtable
aberHashMap
nicht, erlaubt diese Klasse nicht, dass Null als Schlüssel oder Wert verwendet wird.« Nullschlüssel und Nullwerte
HashMap
erlaubt maximal einen Nullschlüssel und eine beliebige Anzahl von Nullwerten. Wenn asHashtable
nicht einmal einen einzelnen Nullschlüssel und einen Nullwert zulässt, wird, wenn der Schlüssel oder Wert Null ist, eine NullPointerException ausgelöst. Beispiel« Synchronisiert, threadsicher
Hashtable
ist intern synchronisiert. Daher ist die VerwendungHashtable
in Multithread-Anwendungen sehr sicher . Wobei asHashMap
nicht intern synchronisiert ist. Daher ist die VerwendungHashMap
in Multithread-Anwendungen ohne externe Synchronisierung nicht sicher . Sie könnenHashMap
mithilfe derCollections.synchronizedMap()
Methode extern synchronisieren .« Leistung
Da
Hashtable
intern synchronisiert, macht diesHashtable
etwas langsamer als dieHashMap
.@Sehen
HashMap
in Java 8quelle
Bei Thread-Apps können Sie häufig mit ConcurrentHashMap davonkommen - abhängig von Ihren Leistungsanforderungen.
quelle
1.
Hashmap
undHashTable
sowohl Speicherschlüssel als auch Wert.2.
Hashmap
kann einen Schlüssel als speichernnull
.Hashtable
kann nicht speichernnull
.3.
HashMap
ist nicht synchronisiert, sondernHashtable
synchronisiert.4.
HashMap
kann synchronisiert werden mitCollection.SyncronizedMap(map)
quelle
Abgesehen von den bereits erwähnten Unterschieden sollte beachtet werden, dass seit Java 8
HashMap
die in jedem Bucket verwendeten Knoten (verknüpfte Liste) dynamisch durch TreeNodes (rot-schwarzer Baum) ersetzt werden, so dass selbst bei Kollisionen mit hohem Hash der schlimmste Fall vorliegt, wenn suchen istO (log (n)) für
HashMap
Vs O (n) inHashtable
.* Die oben erwähnte Verbesserung wurde nicht angewandt worden
Hashtable
noch, aber nur zuHashMap
,LinkedHashMap
undConcurrentHashMap
.Zu Ihrer Information, derzeit
TREEIFY_THRESHOLD = 8
: Wenn ein Bucket mehr als 8 Knoten enthält, wird die verknüpfte Liste in einen ausgeglichenen Baum umgewandelt.UNTREEIFY_THRESHOLD = 6
: Wenn ein Bucket zu klein wird (aufgrund von Entfernung oder Größenänderung), wird der Baum wieder in eine verknüpfte Liste konvertiert.quelle
Bei HashTable und HashMaps gibt es 5 grundlegende Unterscheidungen.
quelle
Mein kleiner Beitrag:
quelle
HashMap: Es handelt sich um eine Klasse, die im Paket java.util verfügbar ist und zum Speichern des Elements im Schlüssel- und Wertformat verwendet wird.
Hashtable: Es handelt sich um eine Legacy-Klasse, die im Collection-Framework erkannt wird.
quelle
HashTable ist eine Legacy-Klasse im JDK, die nicht mehr verwendet werden sollte. Ersetzen Sie die Verwendung durch ConcurrentHashMap . Wenn Sie keine Thread-Sicherheit benötigen, verwenden Sie HashMap, das nicht threadsicher, aber schneller ist und weniger Speicher benötigt.
quelle
Hashtable
ist synchronisiert, während diesHashMap
nicht der Fall ist.HashMap
ausfallsicher ist, während der Enumerator für dieHashtable
nicht ausfallsicher ist. Wenn Sie die Karte während der Iteration ändern, wissen Sie Bescheid.HashMap
erlaubt Nullwerte darin, währendHashtable
dies nicht der Fall ist.quelle
HashMap und HashTable
1) Hashtable und Hashmap implementieren die Schnittstelle java.util.Map. 2) Sowohl Hashmap als auch Hashtable sind die Hash-basierte Sammlung. und am Hashing arbeiten. Das sind also Ähnlichkeiten von HashMap und HashTable.
1) Der erste Unterschied ist, dass HashMap nicht threadsicher ist, während HashTable ThreadSafe ist.
2) HashMap ist leistungsmäßig besser, da es nicht threadsicher ist. Die Leistung von Hashtable ist jedoch nicht besser, da sie threadsicher ist. Daher können mehrere Threads nicht gleichzeitig auf Hashtable zugreifen.
quelle
Hashtable:
Hashtable ist eine Datenstruktur, die die Werte des Schlüssel-Wert-Paares beibehält. Sowohl für die Schlüssel als auch für die Werte ist keine Null zulässig. Sie erhalten einen,
NullPointerException
wenn Sie einen Nullwert hinzufügen. Es ist synchronisiert. Es kommt also mit seinen Kosten. Zu einem bestimmten Zeitpunkt kann nur ein Thread auf HashTable zugreifen .Beispiel :
HashMap:
HashMap ähnelt Hashtable , akzeptiert jedoch auch Schlüsselwertpaare. Es erlaubt null sowohl für die Schlüssel als auch für die Werte. Seine Leistung ist besser als
HashTable
, weil es istunsynchronized
.Beispiel:
quelle
HashMap
wird emuliert und kann daher verwendet werden,GWT client code
während diesHashtable
nicht der Fall ist.quelle
Altes und klassisches Thema, möchte nur diesen hilfreichen Blog hinzufügen, der dies erklärt:
http://blog.manishchhabra.com/2012/08/the-5-main-differences-betwen-hashmap-and-hashtable/
Blog von Manish Chhabra
quelle
HashMap und Hashtable werden beide zum Speichern von Daten in Schlüssel- und Wertform verwendet. Beide verwenden die Hashing-Technik, um eindeutige Schlüssel zu speichern. Es gibt jedoch viele Unterschiede zwischen den unten angegebenen HashMap- und Hashtable-Klassen.
quelle