1. Introduzione
Quando si programma in Java, List è una delle strutture dati più usate e importanti. Utilizzare una List consente di memorizzare più elementi in ordine e di eseguire facilmente operazioni come aggiungere, rimuovere e cercare elementi secondo necessità.
Tuttavia, per usare le List in modo efficace è fondamentale comprendere appieno i metodi di inizializzazione. Un’inizializzazione errata può provocare errori o bug inattesi e influire notevolmente sulla leggibilità e sulla manutenibilità del codice.
In questo articolo ci concentriamo sul tema “Inizializzazione di List in Java” e spieghiamo tutto, dalle semplici tecniche di inizializzazione adatte ai principianti fino a metodi pratici e insidie comuni. Trattiamo anche le differenze tra le versioni di Java e le best practice basate su scenari di codifica reali.
Che tu stia appena iniziando a imparare Java o che utilizzi le List regolarmente, questa è un’ottima occasione per rivedere e organizzare i diversi pattern di inizializzazione.
Alla fine è presente una sezione FAQ per aiutare a risolvere le domande e i problemi più frequenti.
2. Metodi di Inizializzazione di Base delle List
Quando si inizia a usare le List in Java, il primo passo è creare una “List vuota”, cioè inizializzare la List. Qui spieghiamo i metodi di inizializzazione di base usando l’implementazione più comune, ArrayList.
2.1 Creare una List Vuota con new ArrayList<>()
Il metodo di inizializzazione più usato è new ArrayList<>(), scritto come segue:
List<String> list = new ArrayList<>();
Questo crea una List vuota senza elementi.
Punti chiave:
Listè un’interfaccia, quindi si istanzia una classe concreta comeArrayListoLinkedList.- È generalmente consigliato dichiarare la variabile come
Listper mantenere la flessibilità.
2.2 Inizializzare con una Capacità Iniziale Specificata
Se prevedi di memorizzare una grande quantità di dati o conosci già il numero di elementi, specificare la capacità iniziale migliora l’efficienza.
Esempio:
List<Integer> numbers = new ArrayList<>(100);
Questo riserva spazio per 100 elementi internamente, riducendo i costi di ridimensionamento quando si aggiungono elementi e migliorando le prestazioni.
2.3 Inizializzare una LinkedList
Puoi anche usare LinkedList a seconda delle tue esigenze. L’uso è quasi identico:
List<String> linkedList = new LinkedList<>();
LinkedList è particolarmente efficace in situazioni in cui gli elementi vengono aggiunti o rimossi frequentemente.
Java rende semplice l’inizializzazione di List vuote usando new ArrayList<>() o new LinkedList<>().
3. Creare List con Valori Iniziali
In molti casi potresti voler creare una List che contenga già dei valori iniziali. Di seguito i pattern di inizializzazione più comuni e le loro caratteristiche.
3.1 Usare Arrays.asList()
Uno dei metodi più usati in Java è Arrays.asList().
Esempio:
List<String> list = Arrays.asList("A", "B", "C");
Questo crea una List con valori iniziali.
Note importanti:
- La List restituita è di dimensione fissa e non può cambiare lunghezza. Chiamare
add()oremove()generaUnsupportedOperationException. - Sostituire gli elementi (con
set()) è consentito.
3.2 Usare List.of() (Java 9+)
A partire da Java 9, List.of() consente di creare facilmente List immutabili:
List<String> list = List.of("A", "B", "C");
Caratteristiche:
- List completamente immutabile —
add(),set()eremove()sono tutti proibiti. - Altamente leggibile e ideale per valori costanti.
3.3 Creare una List Mutabile da Arrays.asList()
Se desideri una List con valori iniziali ma vuoi anche modificarla in seguito, questo metodo è utile:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Questo crea una List mutabile.
add()eremove()funzionano normalmente.
3.4 Inizializzazione Double‑Brace
Una tecnica più avanzata che utilizza una classe anonima:
List<String> list = new ArrayList<>() {{
add("A");
add("B");
add("C");
}};
Caratteristiche e avvertimenti:
- Crea codice compatto ma introduce una classe anonima, causando overhead aggiuntivo e possibili perdite di memoria.
- Usalo solo per demo rapide o codice di test; non è consigliato per la produzione.
Questo dimostra che Java offre vari modi per creare List con valori iniziali a seconda delle tue esigenze.
5. Confronto e Criteri di Selezione
Java propone una varietà di metodi per l’inizializzazione delle List, e la scelta migliore dipende dal caso d’uso. Questa sezione riassume ogni metodo e spiega quando scegliere quale.
5.1 Liste Mutabili vs Liste Immutabili
- Liste Mutabili
- Gli elementi possono essere aggiunti, rimossi o modificati.
- Esempi:
new ArrayList<>(),new ArrayList<>(Arrays.asList(...)) Ideali per operazioni dinamiche o per aggiungere elementi in cicli.
Liste Immutabili
- Nessuna aggiunta, cancellazione o modifica.
- Esempi:
List.of(...),Collections.singletonList(...),Collections.nCopies(...) - Ideali per costanti o per passare valori in modo sicuro.
5.2 Tabella di Confronto dei Metodi Comuni
| Method | Mutability | Java Version | Characteristics / Use Cases |
|---|---|---|---|
new ArrayList<>() | Mutable | All Versions | Empty List; add elements freely |
Arrays.asList(...) | Fixed Size | All Versions | Has initial values but size cannot change |
new ArrayList<>(Arrays.asList(...)) | Mutable | All Versions | Initial values + fully mutable; widely used |
List.of(...) | Immutable | Java 9+ | Clean immutable List; no modifications allowed |
Collections.singletonList(...) | Immutable | All Versions | Immutable List with a single value |
Collections.nCopies(n, obj) | Immutable | All Versions | Initialize with n identical values; useful for testing |
Stream.generate(...).limit(n) | Mutable | Java 8+ | Flexible pattern generation; good for random or sequential data |
5.3 Modelli di Inizializzazione Consigliati per Caso d’Uso
- Quando ti serve solo una
Listvuota new ArrayList<>()Quando ti servono valori iniziali e vuoi modificarli in seguito
new ArrayList<>(Arrays.asList(...))Quando la usi come costante senza modifiche
List.of(...)(Java 9+)Collections.singletonList(...)Quando vuoi un numero fisso di valori identici
Collections.nCopies(n, value)Quando i valori devono essere generati dinamicamente
Stream.generate(...).limit(n).collect(Collectors.toList())

5.4 Note Importanti
- Tentare di modificare
Listimmutabili o a dimensione fissa genera eccezioni. - Scegli il metodo che meglio si adatta alla mutabilità richiesta e alla versione di Java in uso.
Scegliere il metodo di inizializzazione corretto previene bug non intenzionali e migliora leggibilità e sicurezza.
6. Errori Comuni e Come Risolverli
Alcuni errori si verificano frequentemente durante l’inizializzazione o l’uso delle List in Java. Ecco esempi comuni e le relative soluzioni.
6.1 UnsupportedOperationException
Scenari comuni:
- Chiamare
add()oremove()su unaListcreata conArrays.asList(...) - Modificare una
Listcreata conList.of(...),Collections.singletonList(...)oCollections.nCopies(...)
Esempio:
List<String> list = Arrays.asList("A", "B", "C");
list.add("D"); // Throws UnsupportedOperationException
Causa:
- Questi metodi creano
Listche non possono cambiare dimensione o sono completamente immutabili.
Soluzione:
- Avvolgere con una
Listmutabile:new ArrayList<>(Arrays.asList(...))
6.2 NullPointerException
Scenario comune:
- Accedere a una
Listmai inizializzata
Esempio:
List<String> list = null;
list.add("A"); // NullPointerException
Causa:
- Un metodo è chiamato su un riferimento
null.
Soluzione:
- Inizializzare sempre prima dell’uso:
List<String> list = new ArrayList<>();
6.3 Problemi Relativi al Tipo
- Creare una
Listsenza generics aumenta il rischio di errori di tipo a runtime.
Esempio:
List list = Arrays.asList("A", "B", "C");
Integer i = (Integer) list.get(0); // ClassCastException
Soluzione:
- Usare sempre i generics quando possibile.
Comprendere questi errori comuni ti aiuterà a evitare problemi durante l’inizializzazione o l’uso delle List.
7. Riepilogo
Questo articolo ha illustrato i vari metodi di inizializzazione delle List in Java e come scegliere quello più appropriato. Abbiamo coperto:
- Creazione di una
Listvuota usandonew ArrayList<>()enew LinkedList<>() Listcon valori iniziali usandoArrays.asList(),List.of()enew ArrayList<>(Arrays.asList(...))- Modelli di inizializzazione speciali come
Collections.singletonList(),Collections.nCopies()eStream.generate() - Differenze chiave tra
Listmutabili e immutabili - Trappole comuni e gestione degli errori
Sebbene l’inizializzazione delle List sembri semplice, comprendere queste varianti e selezionare il metodo giusto è fondamentale per scrivere codice sicuro ed efficiente.
8. FAQ (Domande Frequenti)
Q1: Posso aggiungere elementi a una List creata con Arrays.asList()?
A1: No. Arrays.asList() restituisce una List a dimensione fissa. Chiamare add() o remove() genererà una UnsupportedOperationException. Usa new ArrayList<>(Arrays.asList(...)) per ottenere una List mutabile.
Q2: Qual è la differenza tra List.of() e Arrays.asList()?
List.of()(Java 9+) → completamente immutabile; ancheset()non è consentito.Arrays.asList()→ dimensione fissa, maset()è permesso.
Q3: Dovrei usare l’inizializzazione a doppia graffa?
A3: Non è consigliato perché crea una classe anonima e può provocare perdite di memoria. Usa l’inizializzazione standard invece.
Q4: Quali sono i vantaggi di specificare una capacità iniziale?
A4: Riduce il ridimensionamento interno quando si aggiungono molti elementi, migliorando le prestazioni.
Q5: Dovrei sempre usare i generics quando inizializzo le List?
A5: Assolutamente sì. L’uso dei generics aumenta la sicurezza dei tipi e previene errori a runtime.
Q6: Cosa succede se utilizzo una List senza inizializzarla?
A6: Chiamare qualsiasi metodo su di essa causerà una NullPointerException. Inizializzala sempre prima dell’uso.
Q7: Esistono differenze di versione nell’inizializzazione delle List?
A7: Sì. List.of() è disponibile solo a partire da Java 9.

