Java: la classe WeakHashMap

WeakHashMap è un'implementazione dell'interfaccia Map che memorizza solo riferimenti deboli alle sue chiavi. L'archiviazione solo dei riferimenti deboli consente la raccolta di dati obsoleti di una coppia chiave-valore quando la relativa chiave non è più referenziata al di fuori di WeakHashMap.

Questa classe fornisce il modo più semplice per sfruttare il potere dei riferimenti deboli. È utile per implementare strutture di dati "tipo registro", dove l'utilità di una voce svanisce quando la sua chiave non è più raggiungibile da nessun thread.

La WeakHashMap funziona in modo identico alla HashMap con un'eccezione molto importante: se il gestore della memoria Java non ha più un forte riferimento all'oggetto specificato come chiave, la voce nella mappa verrà rimossa.

Weak Reference- Se gli unici riferimenti a un oggetto sono riferimenti deboli, il garbage collector può recuperare la memoria dell'oggetto in qualsiasi momento. Non è necessario attendere che il sistema esaurisca la memoria. Di solito, verrà liberato la prossima volta che viene eseguito il Garbage Collector.

Di seguito è riportato l'elenco dei costruttori supportati dalla classe WeakHashMap.

Sr.No. Costruttore e descrizione
1

WeakHashMap()

Questo costruttore costruisce una nuova WeakHashMap vuota con la capacità iniziale predefinita (16) e il fattore di carico predefinito (0,75).

2

WeakHashMap(int initialCapacity)

Questo costruttore costruisce una nuova WeakHashMap vuota con la capacità iniziale data e il fattore di carico predefinito, che è 0,75.

3

WeakHashMap(int initialCapacity, float loadFactor)

Questo costruttore costruisce una nuova WeakHashMap vuota con la capacità iniziale data e il fattore di carico specificato.

4

WeakHashMap(Map t)

Questo costruttore costruisce una nuova WeakHashMap con le stesse mappature della mappa specificata.

Oltre ai metodi ereditati dalle sue classi madri, TreeMap definisce i seguenti metodi:

Sr.No. Metodo e descrizione
1

void clear()

Rimuove tutte le mappature da questa mappa.

2

boolean containsKey(Object key)

Restituisce vero se questa mappa contiene una mappatura per la chiave specificata.

3

boolean containsValue(Object value)

Restituisce vero se questa mappa mappa una o più chiavi sul valore specificato.

4

Set entrySet()

Restituisce una vista della raccolta delle mappature contenute in questa mappa.

5

Object get(Object key)

Restituisce il valore a cui è mappata la chiave specificata in questa mappa hash debole o null se la mappa non contiene alcuna mappatura per questa chiave.

6

boolean isEmpty()

Restituisce vero se questa mappa non contiene mappature valore-chiave.

7

Set keySet()

Restituisce una vista dell'insieme delle chiavi contenute in questa mappa.

8

Object put(Object key, Object value)

Associa il valore specificato alla chiave specificata in questa mappa.

9

void putAll(Map m)

Copia tutte le mappature dalla mappa specificata a questa mappa. Queste mappature sostituiranno tutte le mappature che questa mappa aveva per una qualsiasi delle chiavi attualmente nella mappa specificata.

10

Object remove(Object key)

Rimuove la mappatura per questa chiave da questa mappa, se presente.

11

int size()

Restituisce il numero di mappature valore-chiave in questa mappa.

12

Collection values()

Restituisce una vista della raccolta dei valori contenuti in questa mappa.

Esempio

Il seguente programma illustra molti dei metodi supportati da questa raccolta:

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

Questo produrrà il seguente risultato:

Produzione

Main waiting
Thread waiting

Se non si include la chiamata a System.gc (), il sistema potrebbe non eseguire mai il garbage collector poiché non viene utilizzata molta memoria dal programma. Per un programma più attivo, la chiamata non sarebbe necessaria.