In deze tutorial zullen we met behulp van voorbeelden leren over Java WeakHashMap en zijn bewerkingen. We zullen ook leren over de verschillen tussen WeakHashMap en HashMap
De WeakHashMap
klasse van het Java-verzamelingsraamwerk biedt de functie van de datastructuur van de hashtabel …
Het implementeert de kaartinterface.
Opmerking : sleutels van de zwakke hashmap zijn van het type WeakReference .
Het object van een zwak referentietype kan in Java worden opgehaald als de referentie niet langer in het programma wordt gebruikt.
Laten we eerst leren om een zwakke hash-map te maken. Vervolgens zullen we leren hoe het verschilt van een hashmap.
Maak een WeakHashMap
Om een zwakke hashmap te maken, moeten we het java.util.WeakHashMap
pakket eerst importeren . Zodra we het pakket hebben geïmporteerd, is hier hoe we zwakke hashmaps in Java kunnen maken.
//WeakHashMap creation with capacity 8 and load factor 0.6 WeakHashMap numbers = new WeakHashMap(8, 0.6);
In de bovenstaande code hebben we een zwakke hashmap gemaakt met de naam numbers.
Hier,
- Sleutel - een unieke identificatie die wordt gebruikt om elk element (waarde) in een kaart te associëren
- Waarde - elementen die zijn gekoppeld door sleutels in een kaart
Let op het onderdeel new WeakHashMap(8, 0.6)
. Hier is de eerste parameter capaciteit en de tweede parameter is loadFactor .
- capaciteit - De capaciteit van deze kaart is 8. Dit betekent dat er 8 items kunnen worden opgeslagen.
- loadFactor - De belastingsfactor van deze kaart is 0,6. Dit betekent dat wanneer onze hashtabel voor 60% gevuld is, de items worden verplaatst naar een nieuwe hashtabel die dubbel zo groot is als de originele hashtabel.
Standaard capaciteit en belastingsfactor
Het is mogelijk om een zwakke hashmap te maken zonder de capaciteit en belastingsfactor te definiëren. Bijvoorbeeld,
// WeakHashMap with default capacity and load factor WeakHashMap numbers1 = new WeakHashMap();
Standaard,
- de capaciteit van de kaart zal 16 zijn
- de belastingsfactor zal 0,75 zijn
Verschillen tussen HashMap en WeakHashMap
Laten we eens kijken naar de implementatie van een zwakke hashmap in Java.
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of numbers WeakHashMap numbers = new WeakHashMap(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; // Inserting elements numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("WeakHashMap: " + numbers); // Make the reference null two = null; // Perform garbage collection System.gc(); System.out.println("WeakHashMap after garbage collection: " + numbers); ) )
Uitvoer
WeakHashMap: (Vier = 4, Twee = 2) WeakHashMap na garbagecollection: (Vier)
Zoals we kunnen zien, wordt de sleutel verwijderd wanneer de sleutel twee van een zwakke hashmap is ingesteld op null
en garbage collection uitvoeren.
Het is omdat, in tegenstelling tot hashmaps, sleutels van zwakke hashmaps van een zwak referentietype zijn. Dit betekent dat de invoer van een kaart wordt verwijderd door de garbage collector als de sleutel voor die invoer niet langer wordt gebruikt. Dit is handig om middelen te besparen.
Laten we nu dezelfde implementatie in een hashmap bekijken.
import java.util.HashMap; class Main ( public static void main(String() args) ( // Creating HashMap of even numbers HashMap numbers = new HashMap(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; // Inserting elements numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("HashMap: " + numbers); // Make the reference null two = null; // Perform garbage collection System.gc(); System.out.println("HashMap after garbage collection: " + numbers); ) )
Uitvoer
HashMap: (Vier = 4, Twee = 2) HashMap na garbagecollection: (Vier = 4, Twee = 2)
Hier, wanneer de sleutel twee van de hashmap is ingesteld op null
en garbage collection uitvoeren, wordt de sleutel niet verwijderd.
Dit komt doordat, in tegenstelling tot zwakke hashmaps, sleutels van hashmaps van een sterk referentietype zijn. Dit betekent dat de invoer van een kaart niet wordt verwijderd door de garbage collector, ook al wordt de sleutel voor die invoer niet langer gebruikt.
Opmerking : alle functionaliteiten van hashmaps en zwakke hashmaps zijn vergelijkbaar, behalve dat sleutels van een zwakke hashmap een zwakke referentie zijn, terwijl sleutels van een hashmap een sterke referentie zijn.
WeakHashMap maken van andere kaarten
Hier is hoe we een zwakke hashmap kunnen maken van andere kaarten.
import java.util.HashMap; import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating a hashmap of even numbers HashMap evenNumbers = new HashMap(); String two = new String("Two"); Integer twoValue = 2; evenNumbers.put(two, twoValue); System.out.println("HashMap: " + evenNumbers); // Creating a weak hash map from other hashmap WeakHashMap numbers = new WeakHashMap(evenNumbers); System.out.println("WeakHashMap: " + numbers); ) )
Uitvoer
HashMap: (Twee = 2) WeakHashMap: (Twee = 2)
Methoden van WeakHashMap
De WeakHashMap
klasse biedt methoden waarmee we verschillende bewerkingen op de kaart kunnen uitvoeren.
Voeg elementen toe aan WeakHashMap
put()
- voegt de opgegeven sleutel / waarde-toewijzing in op de kaartputAll()
- voegt alle gegevens van de opgegeven kaart in op deze kaartputIfAbsent()
- voegt de opgegeven sleutel / waarde-toewijzing in op de kaart als de opgegeven sleutel niet aanwezig is op de kaart
Bijvoorbeeld,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap evenNumbers = new WeakHashMap(); String two = new String("Two"); Integer twoValue = 2; // Using put() evenNumbers.put(two, twoValue); String four = new String("Four"); Integer fourValue = 4; // Using putIfAbsent() evenNumbers.putIfAbsent(four, fourValue); System.out.println("WeakHashMap of even numbers: " + evenNumbers); //Creating WeakHashMap of numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); // Using putAll() numbers.putAll(evenNumbers); System.out.println("WeakHashMap of numbers: " + numbers); ) )
Uitvoer
WeakHashMap met even nummers: (Vier = 4, Twee = 2) WeakHashMap met nummers: (Twee = 2, Vier = 4, Een = 1)
Toegang tot WeakHashMap Elements
1. Using entrySet(), keySet() and values()
entrySet()
- returns a set of all the key/value mapping of the mapkeySet()
- returns a set of all the keys of the mapvalues()
- returns a set of all the values of the map
For example,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // Using entrySet() System.out.println("Key/Value mappings: " + numbers.entrySet()); // Using keySet() System.out.println("Keys: " + numbers.keySet()); // Using values() System.out.println("Values: " + numbers.values()); ) )
Output
WeakHashMap: (Two=2, One=1) Key/Value mappings: (Two=2, One=1) Keys: (Two, One) Values: (1, 2)
2. Using get() and getOrDefault()
get()
- Returns the value associated with the specified key. Returnsnull
if the key is not found.getOrDefault()
- Returns the value associated with the specified key. Returns the specified default value if the key is not found.
For example,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // Using get() int value1 = numbers.get("Two"); System.out.println("Using get(): " + value1); // Using getOrDefault() int value2 = numbers.getOrDefault("Four", 4); System.out.println("Using getOrDefault(): " + value2); ) )
Output
WeakHashMap: (Two=2, One=1) Using get(): 2 Using getOrDefault(): 4
Remove WeakHashMap Elements
remove(key)
- returns and removes the entry associated with the specified key from the mapremove(key, value)
- removes the entry from the map only if the specified key mapped to the specified value and return a boolean value
For example,
import java.util.WeakHashMap; class Main ( public static void main(String() args) ( // Creating WeakHashMap of even numbers WeakHashMap numbers = new WeakHashMap(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: " + numbers); // Using remove() with single parameter int value = numbers.remove("Two"); System.out.println("Removed value: " + value); // Using remove() with 2 parameters boolean result = numbers.remove("One", 3); System.out.println("Is the entry (One=3) removed? " + result); System.out.println("Updated WeakHashMap: " + numbers); ) )
Output
WeakHashMap: (Two = 2, One = 1) Waarde verwijderd: 2 Is de vermelding (One = 3) verwijderd? False Bijgewerkt WeakHashMap: (One = 1)
Andere methoden van WeakHashMap
Methode | Omschrijving |
---|---|
clear() | Verwijdert alle vermeldingen van de kaart |
containsKey() | Controleert of de kaart de opgegeven sleutel bevat en retourneert een booleaanse waarde |
containsValue() | Controleert of de kaart de opgegeven waarde bevat en retourneert een booleaanse waarde |
size() | Retourneert de grootte van de kaart |
isEmpty() | Controleert of de kaart leeg is en retourneert een booleaanse waarde |
Ga voor meer informatie naar Java WeakHashMap (officiële Java-documentatie).