Unterschiede zwischen HashMap und Hashtable

1. Übersicht

In diesem kurzen Tutorial konzentrieren wir uns auf die Hauptunterschiede zwischen der Hashtable und der HashMap .

2. Hashtable und HashMap in Java

Hashtable und HashMap sind sich ziemlich ähnlich - beide sind Sammlungen, die die Map- Schnittstelle implementieren .

Außerdem bieten die Methoden put () , get () , remove () und includesKey () eine zeitkonstante Leistung O (1). Intern basieren diese Methoden auf einem allgemeinen Konzept des Hashings unter Verwendung von Buckets zum Speichern von Daten.

Keine der Klassen behält die Einfügereihenfolge der Elemente bei. Mit anderen Worten, das erste hinzugefügte Element ist möglicherweise nicht das erste Element, wenn wir die Werte durchlaufen.

Aber sie haben auch einige Unterschiede, die in manchen Situationen einen besser als den anderen machen. Schauen wir uns diese Unterschiede genauer an.

3. Unterschiede zwischen Hashtable und HashMap

3.1. Synchronisation

Erstens ist Hashtable threadsicher und kann von mehreren Threads in der Anwendung gemeinsam genutzt werden.

Andererseits ist HashMap nicht synchronisiert und kann ohne zusätzlichen Synchronisationscode nicht von mehreren Threads aufgerufen werden. Wir können Collections.synchronizedMap () verwenden , um eine thread-sichere Version einer HashMap zu erstellen . Wir können auch einfach einen benutzerdefinierten Sperrcode erstellen oder den Code mithilfe des synchronisierten Schlüsselworts threadsicher machen.

HashMap ist nicht synchronisiert, daher schneller und benötigt weniger Speicher als Hashtable . Im Allgemeinen sind nicht synchronisierte Objekte in einer Anwendung mit einem Thread schneller als synchronisierte.

3.2. Nullwerte

Ein weiterer Unterschied ist die Nullbehandlung . Mit HashMap können Sie einen Eintrag mit null als Schlüssel sowie viele Einträge mit null als Wert hinzufügen . Im Gegensatz dazu Hashtable nicht zulässt , dass null überhaupt . Sehen wir uns ein Beispiel für null und HashMap an :

HashMap map = new HashMap(); map.put(null, "value"); map.put("key1", null); map.put("key2", null);

Dies führt zu:

assertEquals(3, map.size());

Als nächstes wollen wir sehen, wie sich Hashtable unterscheidet:

Hashtable table = new Hashtable(); table.put("key", null);

Dies führt zu einer NullPointerException . Das Hinzufügen eines Objekts mit null als Schlüssel führt auch zu einer NullPointerException :

table.put(null, "value");

3.3. Iteration über Elemente

HashMap verwendet Iterator zu iterieren Werte, während Hashtable hat Enumerator für das gleiche. Der Iterator ist ein Nachfolger von Enumerator , der seine wenigen Nachteile beseitigt. Beispielsweise verfügt Iterator über eine remove () -Methode, um Elemente aus zugrunde liegenden Sammlungen zu entfernen.

Der Iterator ist ein ausfallsicherer Iterator. Mit anderen Worten, es wird eine ConcurrentModificationException ausgelöst, wenn die zugrunde liegende Auflistung während der Iteration geändert wird. Sehen wir uns das Beispiel für Fail-Fast an:

HashMap map = new HashMap(); map.put("key1", "value1"); map.put("key2", "value2"); Iterator iterator = map.keySet().iterator(); while(iterator.hasNext()){ iterator.next(); map.put("key4", "value4"); }

Dies löst eine ConcurrentModificationException- Ausnahme aus, da wir put () aufrufen , während wir die Auflistung durchlaufen.

4. Wenn wählen HashMap Over Hashtable

Wir sollten HashMap für eine nicht synchronisierte oder Single-Threaded-Anwendung verwenden.

Es ist erwähnenswert, dass Hashtable seit JDK 1.8 veraltet ist. Allerdings ConcurrentHashMap ist ein großer Hashtable Ersatz. Wir sollten ConcurrentHashMap in Betracht ziehen , um es in Anwendungen mit mehreren Threads zu verwenden.

5. Schlussfolgerung

In diesem Artikel haben wir die Unterschiede zwischen HashMap und Hashtable veranschaulicht und erläutert, was zu beachten ist, wenn wir eine auswählen müssen.

Wie üblich ist die Implementierung all dieser Beispiele und Codefragmente auf Github beendet.