Nella programmazione abbiamo spesso bisogno di gestire dinamicamente insiemi di dati all'interno di particolari strutture (collezioni di elementi), desideriamo quindi aggiungere, rimuovere o visualizzare elementi. In Java una buona pratica nella scelta della struttura di raggruppamento è partire dalle interfacce di alto livello che descrivono i tipi base in modo astratto, scegliendo successivamente la classe che implementa il tipo base, attraverso considerazioni che riguardano la velocità di esecuzione e il consumo di memoria. A questi aspetti ci si riferisce con i termini di costo di tempo e di spazio di un modulo software.
L'interfaccia java.util.Collection
descrive il tipo astratto collezione tramite metodi di cui quelli di uso più frequente sono:
boolean add(E e)
boolean remove(Object o)
boolean contains(Object o)
boolean isEmpty()
void clear()
int size()
Iterator<E> iterator()
Con add()
aggiungiamo un elemento alla collezione, remove()
lo rimuove, mentre con contains() ne testiamo la presenza nella collezione. isEmpty()
consente di verificare se la collezione è vuota (true).
clear()
elimina ogni elemento dalla collezione mentre size()
ne restituisce il totale.
Per iterare gli elementi della collezione possiamo far uso di un oggetto che implementa l'interfaccia
Iterator<E> attraverso l'invocazione di iterator()
.
L'interfaccia Iterator ha quattro metodi di cui i tre fondamentali sono:
boolean hasNext()
E next()
void remove()
hasNext()
verifica durante l'iterazione e attraverso la restituzione del valore true la presenza di un elemento, next()
ne consente il recupero mentre remove()
la rimozione.
java.util.Collection
è estesa da java.util.List<E>
e java.util.Queue<E>
per realizzare i tipi lista e coda. Una lista mantiene i suoi elementi rispettando l'ordine d'inserimento, ogni elemento in lista ha un indice con valore di partenza 0. L'interfaccia List
aggiunge metodi per l'indicizzazione degli elementi:
add(int index, E element)
E get(int index)
int indexOf(Object o)
E remove(int index)
add()
aggiunge l'elemento nella posizione specificata dal parametro index
, get() consente il recupero di un elemento in una particolare posizione, indexOf()
recupera l'indice di un elemento della lista e remove() rimuove di un elemento tramite il suo indice.
Le classi più utilizzate che implementano List
sono java.util.Vector
, java.util.Stack
e java.util.ArrayList
. Vector
fornisce un'implementazione sincronizzata dei metodi di List
risultando Thread Safe. ArrayList
è identica a Vector
ma con metodi non sincronizzati.
Stack
estende Vector
aggiungendo i metodi push()
, pop()
e peek()
per il supporto LIFO (Last in first out) di un dato Pila. Un'alternativa più completa suggerita dalle API Java 8 è utilizzare una classe che implementa l'interfaccia
java.util.Deque
come java.util.ArrayDeque<E>
al posto di Stack
.