Java - La Classe IdentityHashMap

Introduzione

Ciao a tutti, futuri sviluppatori Java! Oggi ci imbarcheremo in un viaggio entusiasmante nel mondo della classe IdentityHashMap di Java. So cosa potreste pensare: "Un'altra classe di mappa? Abbiamo appena visto HashMap?" Avete ragione, ma credetemi, IdentityHashMap ha un sapore unico che la rende speciale. Iniziamo!

Java - The IdentityHashMap Class

Dichiarazione della Classe

Prima di tutto, vediamo come dichiarare un IdentityHashMap:

import java.util.IdentityHashMap;

IdentityHashMap<String, Integer> myMap = new IdentityHashMap<>();

Questa linea di codice crea una nuova IdentityHashMap che memorizzerà chiavi di tipo String e valori di tipo Integer. Ma cosa la rende diversa da una HashMap normale? Ecco dove le cose diventano interessanti!

Costruttori della Classe

IdentityHashMap viene con quattro costruttori. Diamo un'occhiata a ognuno di essi:

  1. Costruttore predefinito:

    IdentityHashMap<String, Integer> map1 = new IdentityHashMap<>();

    Questo crea una IdentityHashMap vuota con una capacità predefinita di 21.

  2. Costruttore con capacità iniziale:

    IdentityHashMap<String, Integer> map2 = new IdentityHashMap<>(100);

    Questo crea una IdentityHashMap vuota con la capacità iniziale specificata.

  3. Costruttore con un'altra Mappa:

    Map<String, Integer> existingMap = new HashMap<>();
    IdentityHashMap<String, Integer> map3 = new IdentityHashMap<>(existingMap);

    Questo crea una IdentityHashMap con le stesse mappature della Mappa specificata.

  4. Costruttore con dimensione massima prevista:

    IdentityHashMap<String, Integer> map4 = new IdentityHashMap<>(100, 0.75f);

    Questo crea una IdentityHashMap vuota con la dimensione massima prevista e il fattore di carico specificati.

Metodi della Classe

Ora, vediamo alcuni dei metodi più comunemente utilizzati in IdentityHashMap:

Metodo Descrizione
put(K key, V value) Associa il valore specificato alla chiave specificata
get(Object key) Restituisce il valore a cui è mappata la chiave specificata
remove(Object key) Rimuove la mappatura per questa chiave se presente
clear() Rimuove tutte le mappature da questa mappa
size() Restituisce il numero di mappature chiave-valore in questa mappa
isEmpty() Restituisce true se questa mappa non contiene mappature chiave-valore
containsKey(Object key) Restituisce true se questa mappa contiene una mappatura per la chiave specificata
containsValue(Object value) Restituisce true se questa mappa mappa una o più chiavi al valore specificato

Vediamo alcuni di questi metodi in azione:

IdentityHashMap<String, Integer> ages = new IdentityHashMap<>();

// Aggiunta di coppie chiave-valore
ages.put("Alice", 25);
ages.put("Bob", 30);

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

// Verificare se una chiave esiste
System.out.println("Charlie esiste? " + ages.containsKey("Charlie")); // Output: Charlie esiste? false

// Rimozione di una coppia chiave-valore
ages.remove("Bob");

// Verificare la dimensione
System.out.println("Numero di voci: " + ages.size()); // Output: Numero di voci: 1

Metodi Ereditati

IdentityHashMap eredita metodi dalle sue superclassi e interfacce. Ecco alcuni di essi:

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 Mappatura Chiave-Valore in un IdentityHashMap

Ora, scaviamo nel motivo per cui IdentityHashMap è speciale. A differenza di HashMap, che utilizza il metodo equals() per confrontare le chiavi, IdentityHashMap utilizza l'uguaglianza di riferimento (==). Questo significa che due chiavi sono considerate uguali solo se sono lo stesso oggetto in memoria.

Vediamo questo in azione:

IdentityHashMap<String, String> identityMap = new IdentityHashMap<>();

String key1 = new String("Ciao");
String key2 = new String("Ciao");

identityMap.put(key1, "Mondo1");
identityMap.put(key2, "Mondo2");

System.out.println("Dimensione di IdentityHashMap: " + identityMap.size());
System.out.println("Valore per key1: " + identityMap.get(key1));
System.out.println("Valore per key2: " + identityMap.get(key2));

Output:

Dimensione di IdentityHashMap: 2
Valore per key1: Mondo1
Valore per key2: Mondo2

Sorpreso? Anche se key1 e key2 hanno lo stesso contenuto ("Ciao"), IdentityHashMap li tratta come chiavi diverse perché sono oggetti String diversi in memoria.

Questo comportamento può essere incredibilmente utile in certe situazioni. Ad esempio, immagina di scrivere un programma per tracciare diverse versioni di un documento. Ogni versione potrebbe avere lo stesso titolo, ma vuoi trattarle come entità separate. IdentityHashMap sarebbe perfetto per questo!

In conclusione, IdentityHashMap è come quel cugino strano nella famiglia delle Mappe. Sembra simile agli altri, ma ha il proprio modo unico di fare le cose. Comprendere quando utilizzarla può renderti un programmatore Java più versatile.

Ricorda, nel mondo della programmazione, non esiste una soluzione adatta a tutti. Ogni strumento ha il suo posto, e sapere quando utilizzare IdentityHashMap è un altro freccia nella tua faretra di conoscenza Java. Continua a praticare, mantieniti curioso e buon coding!

Credits: Image by storyset