HashMap, HashSet und Hashtable in Java

Hiten Kanwar 12 Oktober 2023
  1. Java HashMap
  2. Java Hashtable
  3. Java HashSet
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

Verwandter Artikel - Java Hashtable