Menu

Java HashMap: put, get, iterieren und gängige Muster

Wie man Javas HashMap für Schlüssel-Wert-Abfragen verwendet: put, get, getOrDefault, containsKey, über Einträge iterieren und die Muster, die du am häufigsten brauchst.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

Eine Map speichert Schlüssel-Wert-Paare

Eine HashMap (aus java.util) speichert Zuordnungen: jeder Schlüssel wird auf einen Wert abgebildet, und du schlägst Werte über ihren Schlüssel in annähernd konstanter Zeit nach. Stell dir ein Wörterbuch vor: das Wort ist der Schlüssel, die Definition ist der Wert.

Die beiden Typparameter sind <KeyType, ValueType>. Hier sind die Schlüssel String und die Werte Integer. Wie bei ArrayList typisierst du die Variable üblicherweise als die Map-Schnittstelle und konstruierst eine HashMap.

put, get und Überschreiben

Zwei Dinge, die du verinnerlichen solltest:

  • Ein Schlüssel ist eindeutig. put mit einem vorhandenen Schlüssel ersetzt dessen Wert und gibt den alten zurück.
  • get auf einen fehlenden Schlüssel gibt null zurück, keinen Fehler. Das automatische Unboxing dieses null in ein int wirft eine NullPointerException, eine häufige Fehlerquelle.

getOrDefault umgeht die Null-Falle

Statt jedes Mal auf null zu prüfen, frag nach einem Standardwert:

Das ist die sauberste Art, „vielleicht vorhandene" Abfragen zu behandeln, und führt direkt zum berühmtesten HashMap-Muster.

Vorkommen zählen

Zu zählen, wie oft jedes Element vorkommt, ist die Lehrbuchaufgabe für eine HashMap:

Das Muster map.put(key, map.getOrDefault(key, 0) + 1) liest sich als „nimm den aktuellen Zähler (oder null), addiere eins und speichere ihn zurück". Ein sauberes Äquivalent ist counts.merge(word, 1, Integer::sum).

Prüfen und Entfernen

putIfAbsent(key, value) schreibt nur, wenn der Schlüssel fehlt, nützlich für die verzögerte Initialisierung.

Über eine HashMap iterieren

Die häufigste Schleife durchläuft entrySet() und liefert dir jeden Schlüssel und Wert zusammen:

Wenn du nur die Schlüssel oder nur die Werte brauchst:

Du kannst auch forEach mit einer Lambda verwenden: ages.forEach((name, age) -> System.out.println(name + ": " + age));.

Die HashMap behält die Reihenfolge nicht bei

Eine HashMap gibt keine Garantie über die Iterationsreihenfolge: sie ist das, was das Hashing erzeugt, und kann sich zwischen Durchläufen ändern. Wenn du eine vorhersehbare Reihenfolge brauchst:

  • LinkedHashMap bewahrt die Einfügereihenfolge.
  • TreeMap hält die Schlüssel nach natürlicher Ordnung sortiert (oder nach einem Comparator, den du angibst).

Alle drei implementieren die Map-Schnittstelle, sodass der Wechsel eine einzeilige Änderung am Konstruktor ist.

Schlüssel müssen hashbar sein

HashMap findet Einträge, indem sie den Schlüssel hasht, daher müssen hashCode() und equals() eines Schlüssels miteinander übereinstimmen. Eingebaute Typen wie String und Integer machen das bereits korrekt. Wenn du deine eigene Klasse als Schlüssel verwendest, überschreibe sowohl equals als auch hashCode, andernfalls landen zwei Objekte, die inhaltlich „gleich" sind, in unterschiedlichen Buckets, und deine Abfragen schlagen auf rätselhafte Weise fehl.

Als Nächstes: HashSet

Eine HashMap beantwortet „welcher Wert ist unter diesem Schlüssel gespeichert?". Wenn dich nur interessiert, ob etwas überhaupt vorhanden ist (eine Menge eindeutiger Werte, ohne zugehörige Daten), ist das Werkzeug HashSet, das als Nächstes kommt.

Häufig gestellte Fragen

Wie erstellt man eine HashMap in Java?

Deklariere sie mit zwei Typparametern (dem Schlüsseltyp und dem Werttyp) und rufe den Konstruktor auf: Map<String, Integer> ages = new HashMap<>();. Füge dann Einträge mit ages.put("Ada", 36); hinzu und lies sie mit ages.get("Ada");. Importiere java.util.HashMap und java.util.Map.

Wie durchläuft man eine HashMap in Java?

Iteriere mit einer for-each-Schleife über map.entrySet(), um jeden Schlüssel und Wert zusammen zu erhalten: for (Map.Entry<String, Integer> e : map.entrySet()) { ... }, und lies dabei e.getKey() und e.getValue(). Du kannst auch über map.keySet() für nur die Schlüssel oder über map.values() für nur die Werte iterieren. Beachte, dass eine HashMap die Einfügereihenfolge nicht beibehält.

Was ist der Unterschied zwischen get und getOrDefault?

get(key) gibt den Wert zu einem Schlüssel zurück oder null, wenn der Schlüssel fehlt, was zu einer NullPointerException führen kann, wenn du das Ergebnis direkt verwendest. getOrDefault(key, fallback) gibt den Wert zurück, falls vorhanden, andernfalls den von dir übergebenen Standardwert, sodass du dir die Null-Prüfung sparst. Besonders praktisch ist das beim Zählen: counts.put(c, counts.getOrDefault(c, 0) + 1).

Coddy programming languages illustration

Lerne mit Coddy zu programmieren

LOS GEHT'S