Dans ce didacticiel, nous découvrirons Java WeakHashMap et ses opérations à l'aide d'exemples. Nous découvrirons également les différences entre WeakHashMap et HashMap
La WeakHashMap
classe du framework de collections Java fournit la fonctionnalité de la structure de données de table de hachage …
Il implémente l'interface Map.
Remarque : les clés du hashmap faible sont du type WeakReference .
L'objet d'un type de référence faible peut être récupéré en Java si la référence n'est plus utilisée dans le programme.
Apprenons d'abord à créer une carte de hachage faible. Ensuite, nous apprendrons en quoi il diffère d'un hashmap.
Créer un WeakHashMap
Afin de créer un hashmap faible, nous devons d'abord importer le java.util.WeakHashMap
package. Une fois que nous importons le package, voici comment créer des hashmaps faibles en Java.
//WeakHashMap creation with capacity 8 and load factor 0.6 WeakHashMap numbers = new WeakHashMap(8, 0.6);
Dans le code ci-dessus, nous avons créé une carte de hachage faible nommée nombres.
Ici,
- Clé - un identifiant unique utilisé pour associer chaque élément (valeur) dans une carte
- Valeur - éléments associés par des clés dans une carte
Remarquez la pièce new WeakHashMap(8, 0.6)
. Ici, le premier paramètre est la capacité et le deuxième paramètre est loadFactor .
- capacité - La capacité de cette carte est 8. Cela signifie qu'elle peut stocker 8 entrées.
- loadFactor - Le facteur de charge de cette carte est de 0,6. Cela signifie que chaque fois que notre table de hachage est remplie à 60%, les entrées sont déplacées vers une nouvelle table de hachage de deux fois la taille de la table de hachage d'origine.
Capacité par défaut et facteur de charge
Il est possible de créer un hashmap faible sans définir sa capacité et son facteur de charge. Par exemple,
// WeakHashMap with default capacity and load factor WeakHashMap numbers1 = new WeakHashMap();
Par défaut,
- la capacité de la carte sera de 16
- le facteur de charge sera de 0,75
Différences entre HashMap et WeakHashMap
Voyons l'implémentation d'un hashmap faible en 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); ) )
Production
WeakHashMap: (Quatre = 4, Deux = 2) WeakHashMap après le garbage collection: (Quatre)
Comme nous pouvons le voir, lorsque la clé deux d'une carte de hachage faible est définie sur null
et effectue un ramasse-miettes, la clé est supprimée.
C'est parce que contrairement aux hashmaps, les clés des hashmaps faibles sont de type référence faible . Cela signifie que l'entrée d'une carte est supprimée par le garbage collector si la clé de cette entrée n'est plus utilisée. Ceci est utile pour économiser des ressources.
Voyons maintenant la même implémentation dans un hashmap.
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); ) )
Production
HashMap: (Quatre = 4, Deux = 2) HashMap après garbage collection: (Quatre = 4, Deux = 2)
Ici, lorsque la clé deux de la table de hachage est définie sur null
et effectue un garbage collection, la clé n'est pas supprimée.
En effet, contrairement aux clés de hashmaps faibles, les clés de hashmaps sont de type référence forte . Cela signifie que l'entrée d'une carte n'est pas supprimée par le ramasse-miettes même si la clé de cette entrée n'est plus utilisée.
Remarque : Toutes les fonctionnalités des hashmaps et des hashmaps faibles sont similaires sauf que les clés d'un hashmap faible sont de référence faible, alors que les clés d'un hashmap sont de référence forte.
Création de WeakHashMap à partir d'autres cartes
Voici comment créer un hashmap faible à partir d'autres cartes.
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); ) )
Production
HashMap: (Deux = 2) WeakHashMap: (Deux = 2)
Méthodes de WeakHashMap
La WeakHashMap
classe fournit des méthodes qui nous permettent d'effectuer diverses opérations sur la carte.
Insérer des éléments dans WeakHashMap
put()
- insère le mappage clé / valeur spécifié dans la carteputAll()
- insère toutes les entrées de la carte spécifiée dans cette carteputIfAbsent()
- insère le mappage clé / valeur spécifié dans la carte si la clé spécifiée n'est pas présente dans la carte
Par exemple,
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); ) )
Production
WeakHashMap de nombres pairs: (Quatre = 4, Deux = 2) WeakHashMap de nombres: (Deux = 2, Quatre = 4, Un = 1)
Accéder aux éléments WeakHashMap
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) Valeur supprimée: 2 L'entrée (One = 3) est-elle supprimée? Faux WeakHashMap mis à jour: (Un = 1)
Autres méthodes de WeakHashMap
Méthode | La description |
---|---|
clear() | Supprime toutes les entrées de la carte |
containsKey() | Vérifie si la carte contient la clé spécifiée et renvoie une valeur booléenne |
containsValue() | Vérifie si la carte contient la valeur spécifiée et renvoie une valeur booléenne |
size() | Renvoie la taille de la carte |
isEmpty() | Vérifie si la carte est vide et renvoie une valeur booléenne |
Pour en savoir plus, visitez Java WeakHashMap (documentation Java officielle).