La classe Map – Lezione 37 di Java Avanzato

Le mappe, o array associativi, consentono di associare una chiave di ricerca a dei valori. Le Map possono essere considerate come delle funzioni binarie in cui ad ogni identificativo (chiave) nel dominio viene assegnato un elemento (valore) nel codominio. Una mappa è costituita da coppie del tipo (chiave, valore), in cui per ottenere un valore bisogna necessariamente fornire la chiave ad esso associato.
A differenza degli HashSet e degli HashCode, la chiave viene stabilita dall’utilizzatore e può essere di qualsiasi tipo. Le mappe vengono classicate come collezioni anche se in realtà non implementano l’interfaccia Collection (vedremo in seguito).
Java offre due implementazioni generiche per le mappe: HashMap e TreeMap. Graficamente avremo:

La classe Map

Una mappa è molto simile a Set. L’interfaccia Map aggiunge diversi metodi, tra cui:

  •   V get(Object K)

    Il metodo get restituisce dalla mappa il valore nella chiave K. Il metodo accetta un Object perchè si tratta di un metodo di sola lettura, se K non è una chiave valida viene restituito null;

  •   V put(key: K, value: V)

    Il metodo put restituisce null se la chiave inserita non è attualmente già utilizzata, altrimenti sostituisce il valore associato alla chiave con quello nuovo e restituisce il vecchio valore;

  •   int size()

    Il metodo size consente di ottenere il numero di elementi;

  •   boolean isEmpty()

    Questo metodo isEmpty consente di sapere se sono presenti elementi all’interno della mappa oppure se è vuota;

A differenza delle altre collezioni Map non estente Collection. Ciò è dovuto al fatto che Map non estende Iterable, non può essere iterata come una qualsiasi altra collezione. Map per questo motivo mette a disposizione due metodi:

  •   Set keySet()

    Il metodo keySet restituisce una lista con l’insieme delle chiavi. Non aggiunge spazio aggiuntivo ma è immutabile (non si può utilizzare il metodo remove);

  •   Collection values()

    Consente di ottenere una lista con l’insieme di valori nella mappa.

Implementazioni di Map: HashMap, TreeMap, WeakHashMap

Un’implementazione della classe Map è HashMap, questa classe converte in codice intero le chiavi (hashing). Un HashMap è implementata come una tabella hash in cui:

  1. K, chiave del bucket;
  2. V, valore nel bucket K.

Un buono funzionamento di hashCode si baserà anche su equals. I metodi get e put forniti da HashMap sono costanti in ordine di tempo.

TreeMap implementa l’interfaccia SortedMap che aggiunge due metodi che consentono di ottenere la chiave minima e la chiave massima contenuta nella mappa:

  •   K firstKey()
  •   K lastKey()

I metodi firstKey e lastKey restituiscono la prima e l’ultima chiave della mappa. TreeMap realizza un albero bilanciato stabilendo una relazione d’ordine totale sulle chiavi.

I tempi delle funzioni tra HashMap e TreeMap in base allora loro complessità sono riportati nella tabella riportata di seguito:

Classe/Metodo put get lastKey firstKey
HashMap O(1) O(1)
TreeMap O(n log n) O(n log n) O(1) O(1)

Dalla tabella si può notare che i tempo di inserito e di lettura da un HashMap sono costanti, un TreeSet per poter leggere un elemento dovrò scorrere nella peggiore delle ipotesi un intero ramo dell’albero. Un TreeSet però, offre un ordinamento degli elementi nella mappa ed ha accesso diretto alla prima e all’ultima chiave della mappa.

Una mappa viene creata specificando sia il tipo delle chiavi che il tipo dei valori ad esse associate:

  Map m = new HashMap();
  m.put("uno", new Integer(1));

In questo esempio le chiavi della mappa saranno degli Object, alle chiavi sono associati dei valori di tipo Integer.

Un’altra versione di Map è WeakHashMap in cui gli elementi nella mappa possono essere eliminati in automatico dal Garbage Collector se non più utilizzati.

Indice Lezione PrecedenteLezione Successiva

Pubblicato in Collezioni, Guide, Java, Programmazione Taggato con: , , , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*