Lezioni del modulo (2/2)
Collezioni e ArrayList
Gli array tradizionali in Java hanno una dimensione fissa definita al momento della creazione. Per lavorare con liste di dati la cui dimensione può variare dinamicamente, Java fornisce il Framework delle Collezioni (Java Collections Framework). La classe più utilizzata è ArrayList.
La Classe ArrayList e i Generics
ArrayList implementa un array ridimensionabile in memoria. Per dichiarare un ArrayList, dobbiamo specificare il tipo di elementi che conterrà racchiudendolo tra parentesi angolari < >. Questa funzionalità è chiamata Generics.
Per utilizzare ArrayList, dobbiamo importarla all'inizio del file da java.util.ArrayList.
Dichiarazione e istanziazione:
import java.util.ArrayList;
ArrayList<String> shoppingList = new ArrayList<>();
Metodi Principali
Ecco le operazioni fondamentali su un ArrayList:
add(elemento): Aggiunge un elemento alla fine della lista.get(indice): Restituisce l'elemento all'indice specificato (0-indexed).size(): Restituisce il numero di elementi attualmente presenti nella lista.remove(indice): Rimuove l'elemento all'indice indicato.
shoppingList.add("Pane");
shoppingList.add("Latte");
System.out.println("Elementi: " + shoppingList.size()); // Stampa 2
System.out.println("Primo elemento: " + shoppingList.get(0)); // Stampa "Pane"
Scorrere una Lista (For-Each)
Il ciclo for-each è la struttura ideale per scorrere tutti gli elementi di una collezione:
for (String item : shoppingList) {
System.out.println(item);
}
Array vs ArrayList: Memoria e Prestazioni
Sebbene ArrayList sia molto più flessibile di un array statico, comporta dei costi a livello di prestazioni e memoria:
- Array Statico: È allocato in un blocco di memoria contiguo, ha dimensioni fisse e l'accesso agli elementi tramite indice è estremamente veloce. Memorizza direttamente tipi primitivi senza overhead.
- ArrayList: Internamente gestisce un array che viene ridimensionato (creando un nuovo array più grande e copiando gli elementi vecchi) quando si supera la sua capacità iniziale (generalmente 10). Inoltre, contiene solo riferimenti ad oggetti, introducendo un overhead di memoria per ciascun elemento.
Autoboxing e Unboxing
Dato che ArrayList può ospitare solo oggetti, Java effettua automaticamente la conversione tra tipi primitivi e le loro rispettive classi wrapper:
- Autoboxing: Conversione automatica da tipo primitivo a classe wrapper. Ad esempio, quando fai
numbers.add(42), Java converte automaticamente42(int) inInteger.valueOf(42)(Integer). - Unboxing: Conversione automatica da classe wrapper a tipo primitivo. Ad esempio, quando esegui
int num = numbers.get(0), Java effettua internamente la conversione daIntegeraint.
Prova tu
Importa ArrayList, dichiara un ArrayList di String chiamato names. Aggiungi alla lista Alice e Bob, poi stampane la dimensione usando il metodo size().
Mostra suggerimento
Includi `import java.util.ArrayList;` in cima. Crea la lista con `ArrayList<String> names = new ArrayList<>();`, aggiungi gli elementi e stampane la dimensione con `names.size()`.
Soluzione disponibile dopo 3 tentativi
Dichiara un ArrayList di Integer chiamato numbers, inserisci il numero 42 e stampalo recuperandolo tramite l'indice 0 con get().
Mostra suggerimento
Usa `ArrayList<Integer> numbers = new ArrayList<>();` (con la classe wrapper Integer) e stampalo con `System.out.println(numbers.get(0));`.
Soluzione disponibile dopo 3 tentativi
Dichiara un ArrayList di String chiamato colors. Aggiungi i colori Red, Green e Blue alla lista. Infine, usa un ciclo for-each per scorrere la lista e stampare ciascun colore a schermo.
Mostra suggerimento
Dichiara la lista con `ArrayList<String> colors = new ArrayList<>();`, aggiungi i tre colori e usa un ciclo `for (String c : colors)` per stamparli con `System.out.println(c);`.
Soluzione disponibile dopo 3 tentativi