Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Industrial programming >> Java

Java WeakHashMap – Begrip, gebruik en belangrijke verschillen

Java WeakHashMap

Een uitgebreide handleiding voor Java's WeakHashMap, met aanmaak, kernverschillen met HashMap, praktische voorbeelden en essentiële methoden.

De WeakHashMap-klasse is onderdeel van het Java Collections Framework en implementeert de Map-interface. Het gedraagt zich als een normale hash-tabel maar slaat keys op als zwakke referenties, wat hen laat claimen door de garbage collector wanneer ze niet meer in gebruik zijn.

Java WeakHashMap – Begrip, gebruik en belangrijke verschillen

Let op: Keys in een WeakHashMap zijn verpakt in WeakReference-objecten.

Een zwakke referentie kan garbage-collected worden als het programma geen sterke referentie meer naar het key-object houdt.


Een WeakHashMap aanmaken

Eerst, importeer java.util.WeakHashMap:

import java.util.WeakHashMap;

Instantieer het, optioneel met initiële capaciteit en load factor:

// WeakHashMap met capaciteit 8 en load factor 0.6 WeakHashMap<Key, Value> numbers = new WeakHashMap<>(8, 0.6);

Parameters:

  • capaciteit – het aantal entries dat de map kan bevatten voordat resizing. Standaard is 16.
  • loadFactor – de drempel waarbij de map uitbreidt. Standaard is 0.75.

Bij geen parameters gelden de standaardwaarden:

WeakHashMap<Key, Value> numbers = new WeakHashMap<>();

HashMap vs. WeakHashMap

Terwijl beide Map implementeren, ligt het cruciale verschil in referentiekracht:

  • HashMap – keys zijn sterke referenties; entries persisteren tot expliciete verwijdering.
  • WeakHashMap – keys zijn zwakke referenties; entries verdwijnen wanneer de key niet meer bereikbaar is.

Voorbeeld dat het gedrag demonstreert:

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); // Nullify de referentie naar de key two = null; System.gc(); System.out.println("WeakHashMap na GC: " + numbers); } }

Output:

WeakHashMap: {Four=4, Two=2} WeakHashMap na GC: {Four=4}

De entry voor "Two" verdwijnt omdat de key niet meer sterk bereikbaar is. In contrast, een HashMap zou de entry behouden:

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 na GC: " + numbers); } }

Output:

HashMap: {Four=4, Two=2} HashMap na GC: {Four=4, Two=2}

Dus, WeakHashMap is ideaal wanneer je wilt dat de map automatisch geheugen vrijgeeft gebonden aan ongebruikte keys.


Omzetten vanuit een andere Map

Instantieer een WeakHashMap vanuit een bestaande map om de entries te kopiëren:

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); } }

Output:

HashMap: {Two=2} WeakHashMap: {Two=2}

Belangrijkste methoden van WeakHashMap

Hieronder een selectie van de meest frequente operaties.

Entries invoegen

  • put(key, value) – voegt een mapping toe.
  • putAll(map) – voegt een andere map samen.
  • putIfAbsent(key, value) – voegt alleen toe als key afwezig is.

Voorbeeld:

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); } }

Output:

Even numbers: {Four=4, Two=2} All numbers: {Two=2, Four=4, One=1}

Entries benaderen

Haal data op via:

  • get(key) – retourneert de waarde of null als afwezig.
  • getOrDefault(key, default) – retourneert een default als key ontbreekt.
  • entrySet(), keySet(), values() – itereer over entries, keys of values.

Voorbeeld:

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)); } }

Output:

Map: {Two=2, One=1} Entry set: [Two=2, One=1] Keys: [Two, One] Values: [1, 2] Get Two: 2 GetOrDefault Four: 4

Entries verwijderen

  • remove(key) – verwijdert en retourneert de waarde.
  • remove(key, value) – verwijdert alleen als de huidige mapping matcht met de meegegeven waarde.
  • clear() – leegt de map.
  • containsKey(key), containsValue(value), size(), isEmpty()

Voorbeeld:

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("Verwijderde waarde: " + removed); boolean removedIf = numbers.remove("One", 3); System.out.println("Verwijderd {One=3}? " + removedIf); System.out.println("Na verwijdering: " + numbers); } }

Output:

Map: {Two=2, One=1} Verwijderde waarde: 2 Verwijderd {One=3}? false Na verwijdering: {One=1}

Aanvullende utilities

MethodeBeschrijving
clear()Verwijdert alle entries.
containsKey(key)Controleert of de key bestaat.
containsValue(value)Controleert of een waarde aanwezig is.
size()Retourneert het aantal entries.
isEmpty()Retourneert true als de map geen entries heeft.

Voor een diepere duik, raadpleeg de officiële Java WeakHashMap-documentatie.


Java

  1. Java-operators beheersen: typen, syntax en praktische voorbeelden
  2. Java-commentaar: typen, gebruik en best practices
  3. Java if…else beheersen: control flow uitgelegd
  4. Java Enhanced For-lus beheersen: syntax, voorbeelden en best practices
  5. Java Strings beheersen: aanmaken, methodes en best practices
  6. Java interfaces meesteren: concepten, implementatie en best practices
  7. Java anonieme inner classes meesteren: definitie, syntax en praktische voorbeelden
  8. Java Try-with-resources meesteren: automatische resource management uitgelegd
  9. Java Annotaties uitgelegd: typen, plaatsing en praktische voorbeelden
  10. Java Assertions: een praktische gids voor bugdetectie en codebetrouwbaarheid
  11. Java Vector begrijpen: Gebruik, Kenmerken en Vergelijking met ArrayList