HashMap, HashSet und Hashtable in Java
Die Schnittstelle Collection
von Java stellt uns verschiedene Schnittstellen und Klassen zur Verfügung, um verschiedenste Datenstrukturen und Algorithmen zu implementieren.
Dieses Tutorial behandelt HashMap
, HashSet
und Hashtable
in Java.
Lassen Sie uns zunächst verstehen, was Hash-Tabellen im Allgemeinen sind.
Wir können Hash-Tabellen verwenden, um Elemente in einem Schlüssel-Wert-Paarmuster zu speichern, was bedeutet, dass jedem Schlüssel ein Wert zugeordnet ist. Schlüssel ist ein eindeutiger Wert, der verwendet wird, um die Werte zu indizieren. Wert sind die Daten, die sich auf den entsprechenden Schlüssel beziehen.
Die Datenstruktur der Hash-Tabelle folgt dem Konzept des Hashing, bei dem ein neuer Index unter Verwendung der Schlüssel verarbeitet wird. Das diesem Schlüssel entsprechende Element wird dann im Index gespeichert. Dies ist das Konzept von Hashing.
Sei h(x)
die Hash-Funktion und k
ist ein Schlüssel, dann gibt h(k)
einen neuen Index zum Speichern der mit k
verknüpften Elemente.
Java HashMap
Die HashMap
ist eine Klasse von Javas Collections Framework, die uns die Hash-Tabellen-Datenstruktur liefert. Es speichert die Elemente als Schlüssel-Wert-Paar, wobei Schlüssel die eindeutigen Bezeichner sind, die mit einem bestimmten Wert auf einer Karte gepaart sind. Die Klasse HashMap
implementiert das Map-Interface, welches das Collections-Interface weiter erweitert.
Die HashMap
ist unsynchronisiert, also nicht threadsicher. Wir können über mehrere Threads darauf zugreifen und es gleichzeitig ändern. Es kann von außen gewindesicher gemacht werden.
Ein weiteres Merkmal von HashMap
ist, dass es einen Null-Schlüssel oder Wertepaare enthalten kann.
Zum Beispiel,
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> h = new HashMap<>();
h.put("One", 1);
h.put("Two", 2);
h.put("Three", 3);
System.out.println(h);
}
}
Ausgabe:
HashMap: {One=1, Two=2, Three=3}
Java Hashtable
Die Java-Klasse Hashtable
implementiert die Datenstruktur der Hash-Tabelle. Ähnlich wie HashMap
speichert es die Elemente auch als Schlüssel-Wert-Paar. Sie unterscheidet sich jedoch von einer HashMap
dadurch, dass sie synchronisiert ist. Es speichert das Schlüssel-Wert-Paar in der Hash-Tabelle. Es implementiert die Map-Schnittstelle.
Zuerst geben wir in der Hashtable
das Objekt als Schlüssel mit seinem Wert als Paar an. Der Schlüssel wird dann gehasht, und dann verwenden wir den resultierenden Hash-Code als Index für den in der Tabelle gespeicherten Wert.
Aus diesem Grund besteht das Problem von Hashtable
darin, dass die Synchronisierung jedes Methodenaufrufs relativ nicht unbedeutend ist. Es ist nicht jedes Mal erforderlich. Um dieses Problem zu lösen, haben die Autoren des Collections-Frameworks eine neue Klasse namens HashMap
entwickelt (die auch klarstellt, dass sie die Elemente abbildet), die nicht synchronisiert ist.
Wenn man keine Synchronisation auf Methodenebene verwenden möchte, könnte man die Hashtable
überspringen und Collections.synchronizedMap()
verwenden, die eine Map in eine synchronisierte Map verwandelt. Alternativ können wir ConcurrentHashMap
verwenden, das laut Dokumentation die gleiche Funktionalität wie Hashtable
bietet, aber eine bessere Performance und einige zusätzliche Funktionalitäten bietet.
Zum Beispiel,
import java.io.*;
import java.util.*;
public class Main {
public static void main(String args[]) {
Hashtable<Integer, String> h = new Hashtable<>();
h.put(1, "one");
h.put(2, "two");
h.put(3, "three");
System.out.println(h);
}
}
Ausgabe:
{3=three, 2=two, 1=one}
Java HashSet
Das HashSet
ist eine Klasse des Java-Collections-Frameworks, das uns die Implementierung der Hash-Tabellen-Datenstruktur (genau wie HashMap
) bereitstellt. Dennoch implementiert es die Set
-Schnittstelle (im Gegensatz zu HashMap
), die die Collections-Schnittstelle weiter erweitert. Dies wird im Allgemeinen verwendet, wenn wir keine Schlüssel zu Wertepaaren zuordnen müssen.
Das HashSet
unterscheidet sich von der Hashtable
dadurch, dass HashSet
keine doppelten Werte enthalten kann. Die Schlüssel-Wert-Paare sind eindeutig. Von der Funktionalität her hat HashSet
mit der HashMap
überhaupt nichts gemein, verwendet aber intern zufällig eine HashMap
, um die Set-Schnittstelle zu implementieren.
Zum Beispiel,
import java.util.HashSet;
public class Main {
public static void main(String[] args) {
HashSet<Integer> h = new HashSet<>();
h.add(5);
h.add(10);
h.add(15);
System.out.println(h);
}
}
Ausgabe:
[5, 10, 15]
Verwandter Artikel - Java HashMap
- Initialisieren HashMap in Java
- Kollision in Hashmap in Java
- HashMap in Java sortieren
- Sortieren einer HashMap nach dem Schlüssel in Java
- Unterschied zwischen Hashmap und Map in Java