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
Sowohl HashMap als auch Hashtable implementieren die Map-Schnittstelle, aber Sie müssen zuerst den Unterschied zwischen ihnen verstehen, bevor Sie entscheiden, welche Sie verwenden möchten. Die Hauptunterschiede sind: Thread-Sicherheit, Synchronisation und Geschwindigkeit.
1. HashMap entspricht fast Hashtable, außer dass HashMap nicht synchronisiert ist.
2. HashMap kann Nullschlüssel und -werte akzeptieren, Hashtable jedoch nicht.
3. HashMap ist nicht synchronisiert, während Hashtable synchronisiert ist.
Dies bedeutet, dass Hashtable threadsicher ist und mehrere Threads eine Hashtable gemeinsam nutzen können.
Aber ohne korrekte Synchronisierung können mehrere Threads HashMap nicht gemeinsam nutzen.
Java 5 bietet ConcurrentHashMap, einen Ersatz für HashTable und eine bessere Skalierbarkeit als HashTable.
4. Der Iterator von HashMap (Iterator) ist ein Fail-Fast-Iterator, während der Enumerator-Iterator von Hashtable nicht Fail-Fast 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.
5. 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.
6. HashMap kann nicht garantieren, dass die Reihenfolge der Elemente in der Karte im Laufe der Zeit unverändert bleibt.
Wenn also während der Iteration die HashMap geändert wird, wird eine Ausnahme ausgelöst. Weil einige Elemente möglicherweise nicht iteriert werden können.
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 über die folgende Anweisung synchronisiert werden:
Java-Code
Map m = Collections.synchronizeMap(hashMap); >
Fazit
Hashtable und HashMap weisen mehrere wesentliche Unterschiede auf: Thread-Sicherheit und Geschwindigkeit. Verwenden Sie Hashtable nur, wenn Sie vollständige Thread-Sicherheit benötigen, und wenn Sie Java 5 oder höher verwenden, verwenden Sie ConcurrentHashMap.