Java WeakHashMap

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 WeakHashMapklasse 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.WeakHashMappakket 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 nullen 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 nullen 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 WeakHashMapklasse 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 kaart
  • putAll() - voegt alle gegevens van de opgegeven kaart in op deze kaart
  • putIfAbsent() - 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 map
  • keySet() - returns a set of all the keys of the map
  • values() - 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. Returns null 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 map
  • remove(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).

Interessante artikelen...