Heim  >  Artikel  >  Java  >  Der Unterschied zwischen HashMap und Hashtable in JAVA

Der Unterschied zwischen HashMap und Hashtable in JAVA

PHP中文网
PHP中文网Original
2017-06-22 13:36:011516Durchsuche

Der Vergleich von HashMap und Hashtable ist eine häufige Frage in Java-Interviews. Sie wird verwendet, um zu testen, ob Programmierer Sammlungsklassen korrekt verwenden können und ob sie je nach Situation verschiedene Ideen zur Lösung von Problemen verwenden können. Das Funktionsprinzip von HashMap, der Vergleich zwischen ArrayList und Vector und diese Frage sind die klassischsten Fragen zum Java-Sammlungsframework. Hashtable ist eine veraltete Sammlungsklasse, die schon seit langem in der Java-API existiert. Es wurde in Java 4 neu geschrieben und die Map-Schnittstelle implementiert, sodass es seitdem Teil des Java-Collection-Frameworks ist. Hashtable und HashMap können in Java-Interviews recht einfach gestellt werden und sind sogar zu den am häufigsten gestellten Fragen in Interviewfragen zum Collection Framework geworden. Vergessen Sie also nicht, sich auf diese Frage vorzubereiten, bevor Sie an einem Java-Interview teilnehmen.

In diesem Artikel werden wir nicht nur den Unterschied zwischen HashMap und Hashtable sehen, sondern auch die Ähnlichkeiten zwischen ihnen.

Der Unterschied zwischen HashMap und Hashtable

HashMap und Hashtable implementieren beide die Map-Schnittstelle, aber bevor Sie sich entscheiden, welche Sie verwenden möchten, müssen Sie zunächst den Unterschied zwischen ihnen verstehen. Die Hauptunterschiede sind: Thread-Sicherheit, Synchronisation und Geschwindigkeit.

HashMap entspricht fast Hashtable, außer dass HashMap nicht synchronisiert ist und Nullen akzeptieren kann (HashMap kann Nullschlüssel und -werte akzeptieren, Hashtable jedoch nicht).

HashMap ist nicht synchronisiert, während Hashtable synchronisiert ist, was bedeutet, dass Hashtable threadsicher ist und mehrere Threads eine Hashtable ohne korrekte Synchronisierung teilen können, mehrere Threads können HashMap nicht gemeinsam nutzen. Java 5 bietet ConcurrentHashMap, einen Ersatz für HashTable und eine bessere Skalierbarkeit als HashTable.

Ein weiterer Unterschied besteht darin, dass der Iterator von HashMap (Iterator) ein ausfallsicherer Iterator ist, während der Enumerator-Iterator von Hashtable nicht ausfallsicher ist. Wenn also andere Threads die Struktur der HashMap ändern (Elemente hinzufügen oder entfernen), wird eine ConcurrentModificationException ausgelöst, aber die Methode „remove()“ des Iterators selbst löst beim Entfernen von Elementen keine ConcurrentModificationException aus. Dies ist jedoch kein garantiertes Verhalten, sondern hängt von der JVM ab. Dies ist auch der Unterschied zwischen Enumeration und Iterator.

Da Hashtable threadsicher und synchronisiert ist, ist es in einer Single-Threaded-Umgebung langsamer als HashMap. Wenn Sie keine Synchronisierung benötigen und nur einen einzelnen Thread benötigen, ist die Verwendung von HashMap besser als die von Hashtable.

HashMap kann nicht garantieren, dass die Reihenfolge der Elemente in der Karte im Laufe der Zeit unverändert bleibt.

Einige wichtige Begriffe, die Sie beachten sollten:

1) synchronisiert bedeutet, dass jeweils nur ein Thread die Hashtabelle ändern kann. Das heißt, jeder Thread, der die Hashtable aktualisieren möchte, muss zuerst die Synchronisationssperre erhalten, und andere Threads müssen warten, bis die Synchronisationssperre aufgehoben wird, bevor sie die Synchronisationssperre erneut erhalten und die Hashtable aktualisieren können.

2) Ausfallsicherheit hängt mit dem Iterator zusammen. Wenn ein Sammlungsobjekt einen Iterator oder ListIterator erstellt und andere Threads dann versuchen, das Sammlungsobjekt „strukturell“ zu ändern, wird eine ConcurrentModificationException ausgelöst. Es ist jedoch zulässig, dass andere Threads das Sammlungsobjekt über die set()-Methode ändern können, da dies die Sammlung nicht „strukturell“ ändert. Wenn jedoch die Struktur geändert wurde und die Methode set() erneut aufgerufen wird, wird eine IllegalArgumentException geworfen.

3) Strukturelle Änderungen beziehen sich auf das Löschen oder Einfügen eines Elements, das sich auf die Struktur der Karte auswirkt.

Können wir HashMap synchronisieren?

HashMap kann durch die folgende Anweisung synchronisiert werden:
Map m = Collections.synchronizeMap(hashMap);

Fazit

Es gibt mehrere wesentliche Unterschiede zwischen Hashtable und HashMap : Thread-Sicherheit und Geschwindigkeit. Verwenden Sie Hashtable nur, wenn Sie vollständige Thread-Sicherheit benötigen. Wenn Sie Java 5 oder höher verwenden, verwenden Sie ConcurrentHashMap.

Das obige ist der detaillierte Inhalt vonDer Unterschied zwischen HashMap und Hashtable in JAVA. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn