Java - La classe WeakHashMap

WeakHashMap est une implémentation de l'interface Map qui ne stocke que des références faibles à ses clés. Le stockage uniquement des références faibles permet à une paire clé-valeur d'être récupérée lorsque sa clé n'est plus référencée en dehors de WeakHashMap.

Cette classe fournit le moyen le plus simple d'exploiter la puissance des références faibles. Il est utile pour implémenter des structures de données "de type registre", où l'utilité d'une entrée disparaît lorsque sa clé n'est plus accessible par aucun thread.

Le WeakHashMap fonctionne de la même manière que le HashMap à une exception très importante: si le gestionnaire de mémoire Java n'a plus de référence forte à l'objet spécifié comme clé, alors l'entrée dans la carte sera supprimée.

Weak Reference- Si les seules références à un objet sont des références faibles, le garbage collector peut récupérer la mémoire de l'objet à tout moment.Il n'a pas à attendre que le système soit à court de mémoire. Habituellement, il sera libéré la prochaine fois que le garbage collector s'exécute.

Voici la liste des constructeurs pris en charge par la classe WeakHashMap.

N ° Sr. Constructeur et description
1

WeakHashMap()

Ce constructeur construit un nouveau WeakHashMap vide avec la capacité initiale par défaut (16) et le facteur de charge par défaut (0,75).

2

WeakHashMap(int initialCapacity)

Ce constructeur construit un nouveau WeakHashMap vide avec la capacité initiale donnée et le facteur de charge par défaut, qui est de 0,75.

3

WeakHashMap(int initialCapacity, float loadFactor)

Ce constructeur construit un nouveau WeakHashMap vide avec la capacité initiale et le facteur de charge donnés.

4

WeakHashMap(Map t)

Ce constructeur construit un nouveau WeakHashMap avec les mêmes mappages que le Map spécifié.

Outre les méthodes héritées de ses classes parentes, TreeMap définit les méthodes suivantes -

N ° Sr. Méthode et description
1

void clear()

Supprime tous les mappages de cette carte.

2

boolean containsKey(Object key)

Renvoie true si cette carte contient un mappage pour la clé spécifiée.

3

boolean containsValue(Object value)

Renvoie true si cette carte mappe une ou plusieurs clés à la valeur spécifiée.

4

Set entrySet()

Renvoie une vue de collection des mappages contenus dans cette carte.

5

Object get(Object key)

Renvoie la valeur à laquelle la clé spécifiée est mappée dans cette mappe de hachage faible, ou null si la mappe ne contient aucun mappage pour cette clé.

6

boolean isEmpty()

Renvoie true si cette mappe ne contient aucun mappage clé-valeur.

sept

Set keySet()

Renvoie une vue d'ensemble des clés contenues dans cette carte.

8

Object put(Object key, Object value)

Associe la valeur spécifiée à la clé spécifiée dans cette mappe.

9

void putAll(Map m)

Copie tous les mappages de la carte spécifiée sur cette carte. Ces mappages remplaceront tous les mappages que cette carte avait pour l'une des clés actuellement dans la carte spécifiée.

dix

Object remove(Object key)

Supprime le mappage pour cette clé de cette carte, le cas échéant.

11

int size()

Renvoie le nombre de mappages clé-valeur dans cette carte.

12

Collection values()

Renvoie une vue de collection des valeurs contenues dans cette carte.

Exemple

Le programme suivant illustre plusieurs des méthodes prises en charge par cette collection -

import java.util.*;
public class WeakHashMap_Demo {

   private static Map map;
   public static void main (String args[]) {
      map = new WeakHashMap();
      map.put(new String("Maine"), "Augusta");
      
      Runnable runner = new Runnable() {
         public void run() {
            while (map.containsKey("Maine")) {
               try {
                  Thread.sleep(500);
               } catch (InterruptedException ignored) {
               }
               System.out.println("Thread waiting");
               System.gc();
            }
         }
      };
      Thread t = new Thread(runner);
      t.start();
      System.out.println("Main waiting");
      try {
         t.join();
      } catch (InterruptedException ignored) {
      }
   }
}

Cela produira le résultat suivant -

Production

Main waiting
Thread waiting

Si vous n'incluez pas l'appel à System.gc (), le système peut ne jamais exécuter le garbage collector car peu de mémoire est utilisée par le programme. Pour un programme plus actif, l'appel serait inutile.