COLLECTIONS
Iterator è un’interfaccia che prevede 3 metodi:
- Boolean hasNext()
- E next()
- void remove()
prima di invocare il metodo remove() DEVE essere invocato il metodo next() per posizionarsi sull’elemento, altrimenti si ottiene una IllegalStateException
Quando in un ArrayList si aggiungono o rimuovono degli elementi, tutti gli altri elementi vengono copiati, per cui questi tipi di operazioni sono piuttosto costosi.
ListIterator è un’interfaccia che estende Iterator e permette di scorrere una lista in entrambe le direzioni.
L’interfaccia Map NON estende l’interfaccia Collection.
La classe concreta TreeMap utilizza internamente una struttura red-black tree.
Il metodo da utilizzare per inserire elementi in una HashMap è put.
keySet() è il metodo che ritorna un Set contenente tutte le chiavi inserite in una HashMap
valueSet() è il metodo che ritorna un Set contenente tutti i valori inseriti in una HashMap
Il metodo hashCode() dovrebbe restituire lo stesso codice hash per 2 oggetti se per questi 2 oggetti il metodo equals() restituisce true.
Deque è una Doubly-Ended queue
Comparable è un’interfaccia che ha un unico metodo:
Il metodo binarySearch() della classe Arrays deve essere invocato su un array ordinato per cui, se l’array non lo è, occorre invocare il metodo sort() prima di effettuare la binarySearch.
NON si possono aggiungere elementi ad una lista ritornata dal metodo asList().
E’ però possibile modificare i valori già presenti nella lista e tali modifiche sono propagate all’array originale su cui il metodo asList() è stato invocato.
Esempio con List:
List l = new ArrayList<>();
l.add(10);
l.add(20);
l.add(1,30); // Inserisce il valore 30 nella posizione di indice 1
System.out.println(l); // RISULTATO: [10,30,20]
Il metodo Collections.sort() è presente in 2 versioni:
- Uno che prende in input una lista i cui elementi devono implementare l’interfaccia Comparable
- Uno che prende in input una lista ed una implementazione dell’interfaccia Comparator per ordinare la lista
SortedMap ha un costruttore che prende in input una implementazione di Comparator (e NON di Comparable)
java.util.Date implementa l’interfaccia Comparable
Una SortedMap mantiene le sue entries in ordine crescente se NON gli viene fornita una implementazione dell’interfaccia Comparator da utilizzare per l’ordinamento.
La classe TreeSet ha un metodo comparator che ritorna il Comparator utilizzato oppure null se non ne è stato utilizzato nessuno.
EnumSet è una speciale implementazione dell’interfaccia Set da utilizzare con dati di tipo enum
HashSet è una implementazione dell’interfaccia Set che usa i meccanismi di hashing per fornire un rapido retrieve degli elementi.
NavigableSet fornisce dei metodi di navigazione per cercare ad esempio gli elementi che si avvicinano di più ad un determinato elemento.
NavigableSet è un’interfaccia, per cui non possono essere creati oggetti di questo tipo con l’operatore new.
LinkedHashSet è una sottoclasse di HashSet.
TreeSet è una implementazione di Set che mantiene gli elementi ordinati in ordine crescente.
Un Set, per definizione, non ammette duplicati.
Il metodo peek() delle Queue recupera un elemento dalla cima della coda ma SENZA RIMUOVERE l’elemento dalla struttura.
IdentityHashMap e HashTable sono classi che implementano l’interfaccia Map.
NavigableMap e ConccurentMap sono invece interfacce che estendono l’interfaccia Map.
Il metodo Arrays.asList() ritorna una List basata su un array di lunghezza fissa e NON è modificabile. Se si cerca di eseguire operazioni di modifica sull’oggetto restituito da asList si ottiene una UnsupportedOperationException.
Se viene acquisito un Iterator su un TreeSet e poi si fanno delle modifiche al Set, ad esempio tramite il metodo add() o comunque non tramite l’Iterator, si ottiene una
ConcurrentModificationException
CopyOnWriteArraySet è una implementazione di Set che è thread-safe per cui, anche dopo aver acquisito un Iterator su di esso, posso fare modifiche al Set, ad esempio aggiungendo elementi, senza scatenare un’eccezione.
Gli elementi aggiunti dopo aver acquisito l’Iterator non compariranno nell’Iterator stesso.
CopyOnWriteArraySet NON memorizza gli elementi in modo ordinato.
L’interfaccia Iterable dichiara un solo metodo: Iterator iterator();
PriorityQueue ordina gli elementi in base al loro “ordinamento naturale” se non specificato diversamente. Ad esempio, per il tipo Integer, l’ordinamento naturale è quello crescente.
Il metodo poll() di una implementazione di Queue ritorna l’elemento in testa alla coda e lo rimuove dalla testa della coda stessa.
Se si assegna ad un elemento di un array di un tipo, un oggetto di un tipo differente non legato da una relazione padre-figlio alla classe del tipo dell’array, si ottiene una ArrayStoreException.
Se si crea una PriorityQueue di oggetti di un tipo definito dall’utente, tale classe deve implementare l’interfaccia Comparable e quindi definire il metodo compareTo() che viene utilizzato dalla Queue per prioritizzare gli elementi secondo un criterio.
HashSet non mantiene gli elementi ordinati.
ConcurrentSkipListSet mantiene gli elementi ordinati.
Come parametro nel costruttore di un ArrayList si può passare una Collection di oggetti del tipo dichiarato nell’ArrayList o sue sottoclassi.
SortedMap è un’interfaccia
ConcurrentNavigableMap e NavigableMap sono sue sotto-interfacce o ConcurrentSkipListMap e TreeMap sono sue implementazioni concrete