Guida all'uso della Classe WeakHashMap di Java: Per Principianti

Introduzione

Ciao, futuri programmatori Java! Oggi esploreremo il mondo affascinante della WeakHashMap in Java. Non preoccuparti se non ne hai mai sentito parlare prima – inizieremo dal principio e costruiremo gradualmente la nostra conoscenza. Entro la fine di questo tutorial, diventerai un esperto della WeakHashMap!

Java - WeakHashMap

Cos'è una WeakHashMap?

Immagina di organizzare una grande festa e di avere una lista degli invitati. Ma questa non è una lista qualsiasi – è una lista magica che rimuove automaticamente le persone che non possono più partecipare. In un certo senso, è quello che fa una WeakHashMap in Java, ma con oggetti invece che con ospiti della festa!

Una WeakHashMap è un tipo speciale di Map in Java che consente alle sue chiavi di essere raccolte dal garbage collector quando non sono più utilizzate altrove nel programma. Questo può essere molto utile quando si vuole creare una cache che non impedisca la pulizia degli oggetti quando non sono più necessari.

Dichiarazione della Classe

Iniziamo vedendo come dichiarare una WeakHashMap:

import java.util.WeakHashMap;

public class EsempioWeakHashMap {
public static void main(String[] args) {
WeakHashMap<String, Integer> miaMappaDebole = new WeakHashMap<>();
}
}

In questo esempio, stiamo creando una WeakHashMap che utilizza oggetti String come chiavi e oggetti Integer come valori. La parte <String, Integer> è chiamata "generics" – è come dire a Java quali tipi di oggetti vogliamo memorizzare nella nostra mappa.

Costruttori della Classe

La WeakHashMap ha quattro costruttori diversi. Esaminiamoli uno per uno:

  1. Costruttore predefinito:

    WeakHashMap<String, Integer> mappa1 = new WeakHashMap<>();

    Questo crea una WeakHashMap vuota con la capacità iniziale predefinita (16) e il fattore di carico predefinito (0.75).

  2. Costruttore con capacità iniziale:

    WeakHashMap<String, Integer> mappa2 = new WeakHashMap<>(100);

    Questo crea una WeakHashMap con la capacità iniziale specificata e il fattore di carico predefinito.

  3. Costruttore con capacità iniziale e fattore di carico:

    WeakHashMap<String, Integer> mappa3 = new WeakHashMap<>(100, 0.8f);

    Questo crea una WeakHashMap con la capacità iniziale e il fattore di carico specificati.

  4. Costruttore con un'altra Map:

    Map<String, Integer> mappaEsistente = new HashMap<>();
    mappaEsistente.put("Alice", 25);
    mappaEsistente.put("Bob", 30);
    WeakHashMap<String, Integer> mappa4 = new WeakHashMap<>(mappaEsistente);

    Questo crea una WeakHashMap con le stesse mappature della mappa specificata.

Metodi della Classe

La WeakHashMap fornisce diversi metodi per manipolare e accedere ai suoi contenuti. Ecco una tabella dei metodi più comunemente utilizzati:

Metodo Descrizione
put(K chiave, V valore) Aggiunge una coppia chiave-valore alla mappa
get(Object chiave) Recupera il valore associato alla chiave specificata
remove(Object chiave) Rimuove la mappatura per la chiave specificata
size() Restituisce il numero di mappature chiave-valore nella mappa
clear() Rimuove tutte le mappature dalla mappa
containsKey(Object chiave) Restituisce true se la mappa contiene la chiave specificata
containsValue(Object valore) Restituisce true se la mappa contiene il valore specificato
isEmpty() Restituisce true se la mappa non contiene mappature chiave-valore

Vediamo alcuni di questi metodi in azione:

WeakHashMap<String, Integer> mappaEtà = new WeakHashMap<>();

// Aggiunta di coppie chiave-valore
mappaEtà.put("Alice", 25);
mappaEtà.put("Bob", 30);
mappaEtà.put("Charlie", 35);

// Recupero di un valore
System.out.println("Età di Alice: " + mappaEtà.get("Alice")); // Output: Età di Alice: 25

// Controllo dell'esistenza di una chiave
System.out.println("La chiave David è nella mappa? " + mappaEtà.containsKey("David")); // Output: La chiave David è nella mappa? false

// Rimozione di una coppia chiave-valore
mappaEtà.remove("Bob");
System.out.println("Dimensione della mappa dopo aver rimosso Bob: " + mappaEtà.size()); // Output: Dimensione della mappa dopo aver rimosso Bob: 2

// Pulizia della mappa
mappaEtà.clear();
System.out.println("La mappa è vuota? " + mappaEtà.isEmpty()); // Output: La mappa è vuota? true

Metodi Ereditati

La WeakHashMap eredita metodi dalle sue classi genitrici e interfacce. Ecco alcuni dei metodi ereditati più importanti:

Ereditato Da Metodi
java.util.AbstractMap clone(), equals(), hashCode(), toString()
java.util.Map entrySet(), keySet(), values()
java.lang.Object finalize(), getClass(), notify(), notifyAll(), wait()

Esempio di Aggiunta di una Coppia Chiave-Valore a una WeakHashMap di Coppie Integer, Integer

Ora, vediamo un esempio più completo dell'uso di una WeakHashMap con chiavi e valori Integer:

import java.util.WeakHashMap;

public class EsempioWeakHashMap {
public static void main(String[] args) {
WeakHashMap<Integer, Integer> mappaQuadrati = new WeakHashMap<>();

// Aggiunta di coppie chiave-valore
for (int i = 1; i <= 5; i++) {
mappaQuadrati.put(i, i * i);
}

System.out.println("Mappa iniziale: " + mappaQuadrati);

// Accesso ai valori
System.out.println("Quadrato di 3: " + mappaQuadrati.get(3));

// Rimozione di una coppia chiave-valore
mappaQuadrati.remove(2);
System.out.println("Mappa dopo aver rimosso 2: " + mappaQuadrati);

// Controllo dell'esistenza di una chiave
System.out.println("La mappa contiene 4? " + mappaQuadrati.containsKey(4));

// Controllo dell'esistenza di un valore
System.out.println("La mappa contiene il valore 16? " + mappaQuadrati.containsValue(16));

// Iterazione sulla mappa
System.out.println("Iterazione sulla mappa:");
for (Integer chiave : mappaQuadrati.keySet()) {
System.out.println("Chiave: " + chiave + ", Valore: " + mappaQuadrati.get(chiave));
}
}
}

Output

Quando esegui questo codice, vedrai un output simile a questo:

Mappa iniziale: {5=25, 4=16, 3=9, 2=4, 1=1}
Quadrato di 3: 9
Mappa dopo aver rimosso 2: {5=25, 4=16, 3=9, 1=1}
La mappa contiene 4? true
La mappa contiene il valore 16? true
Iterazione sulla mappa:
Chiave: 5, Valore: 25
Chiave: 4, Valore: 16
Chiave: 3, Valore: 9
Chiave: 1, Valore: 1

E qui avete tutto! Avete appena fatto i vostri primi passi nel mondo della WeakHashMap in Java. Ricordate, la vera potenza della WeakHashMap deriva dalla sua capacità di permettere alle chiavi di essere raccolte dal garbage collector quando non sono più riferite altrove nel vostro programma. Questo può essere incredibilmente utile in alcune situazioni, come l'implementazione di cache o la gestione di dati temporanei.

Man mano che continuate il vostro viaggio in Java, scoprirete sempre più situazioni in cui la WeakHashMap può essere uno strumento prezioso nella vostra scatola degli strumenti di programmazione. Continuate a praticare, a esplorare e, soprattutto, a divertirvi a programmare!

Credits: Image by storyset