Java WeakHashMap – Verständnis, Nutzung und Schlüsselunterschiede
Java WeakHashMap
Ein umfassender Leitfaden zu Javas WeakHashMap, der Erstellung, Schlüsselunterschieden zu HashMap, praktischen Beispielen und essenziellen Methoden abdeckt.
Die WeakHashMap-Klasse ist Teil des Java Collections Framework und implementiert das Map-Interface. Sie verhält sich wie eine normale Hashtabelle, speichert Schlüssel jedoch als schwache Referenzen, was es dem Garbage Collector erlaubt, sie zurückzugewinnen, wenn sie nicht mehr genutzt werden.
Hinweis: Schlüssel in einer WeakHashMap sind in WeakReference-Objekte gewrappt.
Eine schwache Referenz kann garbage-collected werden, wenn das Programm keine starke Referenz mehr auf das Schlüsselobjekt hält.
WeakHashMap erstellen
Zuerst java.util.WeakHashMap importieren:
import java.util.WeakHashMap;
Dann instanziieren, optional mit initialer Kapazität und Load Factor:
// WeakHashMap mit Kapazität 8 und Load Factor 0.6 WeakHashMap<Key, Value> numbers = new WeakHashMap<>(8, 0.6);
Parameter:
- capacity – Anzahl Einträge vor Resizing. Default ist 16.
- loadFactor – Schwellenwert für Expansion. Default ist 0.75.
Ohne Parameter gelten Defaults:
WeakHashMap<Key, Value> numbers = new WeakHashMap<>();
HashMap vs. WeakHashMap
Beide implementieren Map, der Schlüsselunterschied liegt in Referenzstärke:
- HashMap – Schlüssel sind starke Referenzen; Einträge persistieren bis expliziter Entfernung.
- WeakHashMap – Schlüssel sind schwache Referenzen; Einträge verschwinden, wenn Schlüssel nicht mehr erreichbar.
Beispiel zur Demonstration des Verhaltens:
import java.util.WeakHashMap; class Main { public static void main(String[] args) { WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("WeakHashMap: " + numbers); // Referenz auf Schlüssel nullen two = null; System.gc(); System.out.println("WeakHashMap after GC: " + numbers); } }
Ausgabe:
WeakHashMap: {Four=4, Two=2} WeakHashMap after GC: {Four=4}
Der Eintrag für "Two" verschwindet, da sein Schlüssel nicht mehr stark erreichbar ist. Im Gegensatz dazu behält HashMap den Eintrag:
import java.util.HashMap; class Main { public static void main(String[] args) { HashMap<String, Integer> numbers = new HashMap<>(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("HashMap: " + numbers); two = null; System.gc(); System.out.println("HashMap after GC: " + numbers); } }
Ausgabe:
HashMap: {Four=4, Two=2} HashMap after GC: {Four=4, Two=2}
Daher ist WeakHashMap ideal, wenn die Map automatisch Speicher für ungenutzte Schlüssel freigeben soll.
Konvertierung aus einer anderen Map
Instanziieren Sie eine WeakHashMap aus einer existierenden Map, um deren Einträge zu kopieren:
import java.util.HashMap; import java.util.WeakHashMap; class Main { public static void main(String[] args) { HashMap<String, Integer> evenNumbers = new HashMap<>(); String two = new String("Two"); evenNumbers.put(two, 2); System.out.println("HashMap: " + evenNumbers); WeakHashMap<String, Integer> numbers = new WeakHashMap<>(evenNumbers); System.out.println("WeakHashMap: " + numbers); } }
Ausgabe:
HashMap: {Two=2} WeakHashMap: {Two=2}
Wichtige Methoden von WeakHashMap
Hier eine Auswahl der häufigsten Operationen.
Einträge einfügen
put(key, value)– fügt Mapping hinzu.putAll(map)– merged eine andere Map.putIfAbsent(key, value)– fügt nur ein falls Schlüssel abwesend.
Beispiel:
import java.util.WeakHashMap; class Main { public static void main(String[] args) { WeakHashMap<String, Integer> evenNumbers = new WeakHashMap<>(); evenNumbers.put(new String("Two"), 2); evenNumbers.putIfAbsent(new String("Four"), 4); System.out.println("Even numbers: " + evenNumbers); WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); numbers.put(new String("One"), 1); numbers.putAll(evenNumbers); System.out.println("All numbers: " + numbers); } }
Ausgabe:
Even numbers: {Four=4, Two=2} All numbers: {Two=2, Four=4, One=1}
Einträge abrufen
Daten abrufen via:
get(key)– gibt Wert odernullfalls abwesend.getOrDefault(key, default)– gibt Default falls Schlüssel fehlt.entrySet(),keySet(),values()– iterieren über Einträge, Schlüssel oder Werte.
Beispiel:
import java.util.WeakHashMap; class Main { public static void main(String[] args) { WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); numbers.put(new String("One"), 1); numbers.put(new String("Two"), 2); System.out.println("Map: " + numbers); System.out.println("Entry set: " + numbers.entrySet()); System.out.println("Keys: " + numbers.keySet()); System.out.println("Values: " + numbers.values()); System.out.println("Get Two: " + numbers.get("Two")); System.out.println("GetOrDefault Four: " + numbers.getOrDefault("Four", 4)); } }
Ausgabe:
Map: {Two=2, One=1} Entry set: [Two=2, One=1] Keys: [Two, One] Values: [1, 2] Get Two: 2 GetOrDefault Four: 4
Einträge entfernen
remove(key)– entfernt und gibt Wert zurück.remove(key, value)– entfernt nur falls aktuelles Mapping bereitgestellten Wert matcht.clear()– leert Map.containsKey(key),containsValue(value),size(),isEmpty()
Beispiel:
import java.util.WeakHashMap; class Main { public static void main(String[] args) { WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); numbers.put(new String("One"), 1); numbers.put(new String("Two"), 2); System.out.println("Map: " + numbers); int removed = numbers.remove("Two"); System.out.println("Removed value: " + removed); boolean removedIf = numbers.remove("One", 3); System.out.println("Removed {One=3}? " + removedIf); System.out.println("After removal: " + numbers); } }
Ausgabe:
Map: {Two=2, One=1} Removed value: 2 Removed {One=3}? false After removal: {One=1}
Zusätzliche Utilities
| Methode | Beschreibung |
|---|---|
clear() | Löscht alle Einträge. |
containsKey(key) | Prüft ob Schlüssel existiert. |
containsValue(value) | Prüft ob Wert vorhanden. |
size() | Gibt Anzahl Einträge zurück. |
isEmpty() | Gibt true falls Map keine Einträge hat. |
Für tiefere Einblicke siehe die offizielle Java WeakHashMap Dokumentation.
Java
- Java Operatoren meistern: Typen, Syntax und praktische Beispiele
- Java Kommentare: Typen, Verwendung und Best Practices
- Java Enhanced For-Schleife meistern: Syntax, Beispiele und Best Practices
- Java Strings meistern: Erstellung, Methoden und Best Practices
- Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
- Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
- Java Try-With-Resources meistern: Automatisches Ressourcenmanagement erklärt
- Java Annotations erklärt: Typen, Platzierung und praktische Beispiele
- Java Assertions: Praktischer Leitfaden zur Fehlererkennung und Code-Reliabilität
- Java Vector verstehen: Verwendung, Funktionen und Vergleich mit ArrayList