1. Introduzione
Sappiamo già che ArrayList è un «array infinito» che cresce da solo. Ma ha una limitazione: l’accesso agli elementi avviene per numero (indice). Se abbiamo un elenco di mille persone e vogliamo trovare il telefono di Alisa, bisogna o conoscerne l’indice, oppure scorrere tutti in sequenza.
Nella vita invece cerchiamo spesso i dati in base a un tratto unico:
- cerchiamo il numero di telefono per nome,
- cerchiamo il titolare per numero di passaporto,
- in base al login troviamo la password,
- per id cerchiamo l’oggetto nel database.
Per questo serve una struttura che faccia: «ricevo una chiave → trovo subito il valore». In Java se ne occupa HashMap<K,V>.
Analogia:
Immaginate un normale dizionario cartaceo. Cercate la traduzione della parola «house». Non dovete sfogliare tutte le pagine in ordine. Andate subito alla lettera «H» e trovate la parola desiderata. Così funziona anche HashMap: tramite la chiave (la parola) otteniamo istantaneamente il valore (la traduzione).
Creazione di un dizionario
Per creare un dizionario, bisogna indicare quali tipi saranno le chiavi e quali i valori.
import java.util.HashMap;
HashMap<String, String> phonebook = new HashMap<String, String>();
Qui:
- String (primo tipo) è il tipo della chiave (nome della persona).
- String (secondo tipo) è il tipo del valore (numero di telefono).
Ora phonebook è come una vera rubrica telefonica.
Altri esempi:
HashMap<String, Integer> grades = new HashMap<String, Integer>(); // nome → voto
HashMap<Integer, String> users = new HashMap<Integer, String>(); // id → nome
HashMap<String, Boolean> flags = new HashMap<String, Boolean>(); // chiave → valore booleano
A differenza di ArrayList, un dizionario non ha il metodo add(), ma ne ha di propri altrettanto interessanti.
2. Metodo put(key, value) — aggiungere una coppia
La principale differenza di HashMap rispetto ad array e liste è che non memorizza solo un insieme di valori, ma coppie chiave–valore. Questo lo rende simile a un vero dizionario: ogni parola ha una traduzione, ogni nome un telefono, ogni login una password.
Esempio:
phonebook.put("Alisa", "+380501112233");
phonebook.put("Bob", "+380671234567");
Ora nella nostra rubrica telefonica:
- la chiave "Alisa" è associata al valore "+10501112233",
- la chiave "Bob" è associata al valore "+10671234567".
Significa che per ottenere il valore (telefono) ci basta conoscere la chiave (nome).
È importante ricordare: le chiavi sono univoche. Se proviamo ad aggiungere un nuovo valore con una chiave già esistente, il valore precedente verrà sovrascritto.
phonebook.put("Alisa", "+10999999999");
Ora ad Alisa è rimasto solo il nuovo numero: quello vecchio è andato perduto.
Conclusione: put è il metodo per aggiungere o aggiornare le voci. Se la chiave è nuova — la voce viene creata. Se la chiave esiste già — la voce viene aggiornata.
3. Metodo get(key) — ottenere un valore
Per trovare un valore bisogna conoscere la chiave. Questa è la caratteristica principale di HashMap: la ricerca per chiave è molto veloce, praticamente istantanea, sia che abbiamo mille voci sia un milione.
Esempio:
System.out.println(phonebook.get("Alisa"));
Output:
+10501112233
Se tale chiave non esiste, get restituirà null:
System.out.println(phonebook.get("Charli")); // null
Significa: «la chiave "Charli" non è presente nel dizionario».
4. Metodo containsKey(key) — verificare la presenza
Per evitare di imbattersi in null, è utile controllare prima se la chiave è nel dizionario.
Esempio:
System.out.println(phonebook.containsKey("Charli"));
Output:
false
Così possiamo capire in anticipo:
- se la chiave non c’è — creiamo una nuova voce,
- se la chiave c’è — la aggiorniamo.
Schema frequente:
if (phonebook.containsKey("Alisa"))
{
System.out.println("Alisa ha già un numero!");
}
else
{
phonebook.put("Alisa", "+10111111111");
}
5. Metodo remove(key) — eliminare una voce
La rimozione è altrettanto semplice: bisogna solo conoscere la chiave.
phonebook.remove("Bob");
System.out.println(phonebook.get("Bob"));
Output:
null
Ora la voce con chiave "Bob" non è più presente nel dizionario.
6. Iterare tutte le coppie
Spesso è necessario non solo ottenere i dati per una chiave specifica, ma anche stampare l’intero dizionario. Per questo si usa il metodo entrySet().
for (var entry : phonebook.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
Esempio di output:
Alisa -> +10501112233
In questo modo otteniamo subito accesso sia alla chiave (entry.getKey()) sia al valore (entry.getValue()).
7. Pratica: conteggio delle parole
Consideriamo un problema classico — contare quante volte le parole si ripetono in un testo. È uno degli esempi più chiari del perché serve HashMap.
String text = "java java core java";
HashMap<String, Integer> freq = new HashMap<String, Integer>();
for (String w : text.split(" "))
{
Integer old = freq.get(w);
freq.put(w, (old == null) ? 1 : old + 1);
}
System.out.println(freq);
Output:
{core=1, java=3}
Analizziamo in dettaglio cosa succede qui:
- Abbiamo diviso la stringa "java java core java" in parole.
- Per ogni parola verifichiamo se è già nel dizionario (freq.get(w)).
- Se non c’è (null), significa che è la prima occorrenza → mettiamo 1.
- Se c’è, significa che la parola è già apparsa → incrementiamo il valore di uno.
Applicazioni reali:
- conteggio del numero di chiamate a un’API,
- statistiche di frequenza delle parole in un testo,
- memorizzazione delle quantità di prodotti in magazzino.
8. Pratica: rubrica telefonica
Scriviamo un’applicazione un po’ più grande.
import java.util.HashMap;
import java.util.Scanner;
public class PhonebookApp {
public static void main(String[] args)
{
HashMap<String, String> phonebook = new HashMap<String, String>();
Scanner console = new Scanner(System.in);
while (true)
{
System.out.print("Inserisci un nome (o una riga vuota per uscire): ");
String name = console.nextLine();
if (name.isEmpty()) break;
System.out.print("Inserisci il numero: ");
String phone = console.nextLine();
phonebook.put(name, phone);
}
System.out.println("Rubrica telefonica:");
for (var entry : phonebook.entrySet())
{
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
}
}
Il programma funziona come un mini‑repertorio. Inserisci nomi e numeri di telefono: vengono salvati in HashMap. Alla fine puoi stampare l’elenco completo. I dizionari sono molto usati nei progetti reali.
GO TO FULL VERSION