1. Einleitung
Wir wissen bereits, dass ArrayList ein „unendliches Array“ ist, das automatisch wächst. Es hat jedoch eine Einschränkung: Der Zugriff auf Elemente erfolgt über die Nummer (Index). Wenn wir eine Liste mit tausend Personen haben und die Telefonnummer von Alice finden möchten, müssen wir entweder ihren Index kennen oder alle der Reihe nach durchgehen.
Im Alltag suchen wir Daten jedoch oft anhand eines eindeutigen Merkmals:
- über den Namen suchen wir die Telefonnummer,
- über die Passnummer finden wir den Inhaber,
- über den Login finden wir das Passwort,
- über die ID suchen wir ein Objekt in der Datenbank.
Dafür brauchen wir eine Struktur, die kann: „Schlüssel erhalten → Wert sofort finden“. In Java übernimmt das die HashMap<K,V>.
Analogie:
Stellen Sie sich ein gewöhnliches gedrucktes Wörterbuch vor. Sie suchen die Übersetzung des Wortes „house“. Sie müssen nicht alle Seiten der Reihe nach durchblättern. Sie gehen sofort zum Buchstaben „H“ und finden das benötigte Wort. So funktioniert auch die HashMap: Über den Schlüssel (Wort) erhalten wir sofort den Wert (Übersetzung).
Ein Wörterbuch erstellen
Um ein Wörterbuch zu erstellen, müssen Sie angeben, welche Typen die Schlüssel und die Werte haben werden.
import java.util.HashMap;
HashMap<String, String> phonebook = new HashMap<String, String>();
Hier:
- String (erster Typ) ist der Schlüsseltyp (Name der Person).
- String (zweiter Typ) ist der Werttyp (Telefonnummer).
Jetzt ist phonebook wie ein echtes Telefonbuch.
Weitere Varianten:
HashMap<String, Integer> grades = new HashMap<String, Integer>(); // Name → Note
HashMap<Integer, String> users = new HashMap<Integer, String>(); // ID → Name
HashMap<String, Boolean> flags = new HashMap<String, Boolean>(); // Schlüssel → boolescher Wert
Im Unterschied zur ArrayList hat das Wörterbuch keine Methode add(), dafür aber eigene, nicht weniger interessante Methoden.
2. Methode put(key, value) — ein Paar hinzufügen
Der Hauptunterschied der HashMap gegenüber Arrays und Listen besteht darin, dass sie nicht nur eine Menge von Werten speichert, sondern Schlüssel–Wert-Paare. Das macht sie einem echten Wörterbuch ähnlich: Jedes Wort hat eine Übersetzung, jeder Name eine Telefonnummer, jeder Login ein Passwort.
Beispiel:
phonebook.put("Alice", "+380501112233");
phonebook.put("Bob", "+380671234567");
Jetzt enthält unser Telefonbuch:
- der Schlüssel "Alice" ist mit dem Wert "+10501112233" verknüpft,
- der Schlüssel "Bob" ist mit dem Wert "+10671234567" verknüpft.
Das bedeutet, dass wir zum Abrufen des Werts (Telefonnummer) lediglich den Schlüssel (Namen) kennen müssen.
Wichtig: Schlüssel sind eindeutig. Wenn wir versuchen, für einen bereits vorhandenen Schlüssel einen neuen Wert hinzuzufügen, wird der alte Wert überschrieben.
phonebook.put("Alice", "+10999999999");
Jetzt hat Alice nur noch die neue Nummer: Die alte Nummer ist verloren.
Fazit: put ist die Methode zum Hinzufügen oder Aktualisieren von Einträgen. Ist der Schlüssel neu, wird der Eintrag erstellt. Existiert der Schlüssel bereits, wird der Eintrag aktualisiert.
3. Methode get(key) — Wert abrufen
Um einen Wert zu finden, muss man den Schlüssel kennen. Das ist der Clou der HashMap: Die Suche nach einem Schlüssel funktioniert sehr schnell, nahezu sofort, unabhängig davon, ob wir tausend Einträge oder eine Million haben.
Beispiel:
System.out.println(phonebook.get("Alice"));
Ausgabe:
+10501112233
Wenn es einen solchen Schlüssel nicht gibt, liefert get null zurück:
System.out.println(phonebook.get("Charlie")); // null
Das heißt: „Der Schlüssel ‚Charlie‘ ist nicht im Wörterbuch vorhanden.“
4. Methode containsKey(key) — Vorhandensein prüfen
Um nicht auf null zu stoßen, ist es hilfreich, zunächst zu prüfen, ob der Schlüssel im Wörterbuch existiert.
Beispiel:
System.out.println(phonebook.containsKey("Charlie"));
Ausgabe:
false
So können wir im Voraus entscheiden:
- wenn es den Schlüssel nicht gibt — einen neuen Eintrag erstellen,
- wenn es den Schlüssel gibt — ihn aktualisieren.
Häufiges Muster:
if (phonebook.containsKey("Alice"))
{
System.out.println("Alice hat bereits eine Nummer!");
}
else
{
phonebook.put("Alice", "+10111111111");
}
5. Methode remove(key) — Eintrag löschen
Löschen funktioniert ebenso einfach: Man muss nur den Schlüssel kennen.
phonebook.remove("Bob");
System.out.println(phonebook.get("Bob"));
Ausgabe:
null
Jetzt gibt es den Eintrag mit dem Schlüssel "Bob" nicht mehr im Wörterbuch.
6. Alle Paare durchlaufen
Oft müssen wir nicht nur Daten zu einem bestimmten Schlüssel abrufen, sondern das gesamte Wörterbuch ausgeben. Dafür wird die Methode entrySet() verwendet.
for (var entry : phonebook.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
Beispielausgabe:
Alice -> +10501112233
Damit erhalten wir sofort Zugriff sowohl auf den Schlüssel (entry.getKey()) als auch auf den Wert (entry.getValue()).
7. Praxis: Wörter zählen
Betrachten wir eine klassische Aufgabe — das Zählen der Anzahl von Wortwiederholungen in einem Text. Das ist eines der anschaulichsten Beispiele dafür, wozu eine HashMap überhaupt benötigt wird.
String text = "java java core java";
HashMap<String, Integer> freq = new HashMap<String, Integer>();
for (String w : text.split(" "))
{
Integer old = freq.get(w);
freq.put(w, (old == null) ? 1 : old + 1);
}
System.out.println(freq);
Ausgabe:
{core=1, java=3}
Schritt für Schritt, was hier passiert:
- Wir haben den String "java java core java" in Wörter aufgeteilt.
- Für jedes Wort prüfen wir, ob es bereits im Wörterbuch vorhanden ist (freq.get(w)).
- Wenn nicht (null), ist es das erste Auftreten des Wortes → wir legen 1 ab.
- Wenn ja, ist das Wort schon vorgekommen → wir erhöhen den Wert um eins.
Reale Anwendungsfälle:
- Zählen der Anzahl von API-Aufrufen,
- Statistik zur Wortfrequenz in einem Text,
- Speichern der Stückzahlen im Lager.
8. Praxis: Telefonbuch
Schreiben wir eine etwas größere Anwendung.
import java.util.HashMap;
import java.util.Scanner;
public class PhonebookApp {
public static void main(String[] args)
{
HashMap<String, String> phonebook = new HashMap<String, String>();
Scanner console = new Scanner(System.in);
while (true)
{
System.out.print("Geben Sie einen Namen ein (oder eine leere Zeile zum Beenden): ");
String name = console.nextLine();
if (name.isEmpty()) break;
System.out.print("Geben Sie die Nummer ein: ");
String phone = console.nextLine();
phonebook.put(name, phone);
}
System.out.println("Telefonbuch:");
for (var entry : phonebook.entrySet())
{
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
}
}
Das Programm funktioniert wie ein kleines Nachschlagewerk. Sie geben Namen und Telefonnummern ein, sie werden in der HashMap gespeichert. Am Ende können Sie die gesamte Liste ausgeben. Wörterbücher werden in realen Projekten sehr häufig verwendet.
GO TO FULL VERSION