Menu

ArrayList in Java: creare, aggiungere, rimuovere, scorrere e ordinare

Come usare l'ArrayList di Java, la lista ridimensionabile da preferire a un array semplice: aggiungere, leggere, rimuovere, dimensione, cicli e ordinamento.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Una lista che si ridimensiona da sola

Un array Java semplice ha una lunghezza fissa: se scegli dieci posizioni, avrai dieci posizioni per sempre. ArrayList è l'alternativa ridimensionabile di java.util: cresce quando aggiungi, si riduce quando rimuovi e offre metodi comodi per le operazioni che fai davvero con una lista.

Nota il tipo tra parentesi angolari, List<String>, che dice al compilatore che la lista contiene valori String. Il <> (il "diamond") a destra permette a Java di dedurre lo stesso tipo senza ripeterlo. E nota che devi importare java.util.ArrayList: non è disponibile di default.

Dichiara come List, costruisci come ArrayList

Vedrai quasi sempre la variabile dichiarata con l'interfaccia List invece che con la classe concreta ArrayList:

List<String> names = new ArrayList<>();

È una buona abitudine, non una regola. Programmare sull'interfaccia List significa che il resto del codice non si preoccupa di quale implementazione di lista hai usato, quindi in seguito puoi sostituirla con un'altra senza toccarlo. Nell'uso quotidiano le due si comportano allo stesso modo.

Aggiungere, leggere e modificare

  • add(value) aggiunge in fondo.
  • add(index, value) inserisce in una posizione, spostando in avanti gli elementi successivi.
  • get(index) legge l'elemento in una posizione (a partire da zero).
  • set(index, value) sovrascrive un elemento esistente.

Gli indici partono da zero, e get con un indice fuori intervallo lancia IndexOutOfBoundsException.

Rimuovere elementi

C'è una trappola classica quando la lista contiene Integer. remove(int) significa "rimuovi per indice" e remove(Object) significa "rimuovi per valore", quindi:

List<Integer> nums = new ArrayList<>(List.of(10, 20, 30));
nums.remove(1);                      // rimuove l'indice 1 -> il valore 20
nums.remove(Integer.valueOf(20));    // rimuove il valore 20

Avvolgi il valore in Integer.valueOf(...) quando intendi "rimuovi questo valore" e non "rimuovi questo indice".

Dimensione, contains e ricerca dell'indice

List.of(...) crea al volo una lista immutabile; passarla al costruttore di ArrayList ti dà una copia modificabile che parte con quei valori.

Scorrere un ArrayList

Il ciclo più pulito è il for migliorato (il ciclo for-each):

Quando ti serve anche l'indice, usa un ciclo con contatore insieme a size() e get(i):

Una regola: non aggiungere né rimuovere elementi da una lista mentre un ciclo for-each la sta scorrendo, perché viene lanciata una ConcurrentModificationException. Per eliminare in sicurezza gli elementi che corrispondono a una condizione, usa removeIf:

Ordinare

Collections.sort ordina una lista sul posto usando l'ordine naturale (alfabetico per le stringhe, numerico per i numeri):

Per ordinamenti personalizzati, passa un Comparator a list.sort(...), per esempio names.sort(Comparator.comparingInt(String::length)) per ordinare per lunghezza.

ArrayList contiene oggetti, non primitivi

Non puoi scrivere ArrayList<int>. I generics funzionano solo con tipi oggetto, quindi usa la classe wrapper Integer, Double, Boolean e così via:

L'autoboxing di Java converte per te tra int e Integer, quindi il codice si legge in modo naturale: ricorda solo che la lista in sé memorizza oggetti Integer.

Prossimo passo: HashMap

ArrayList è lo strumento giusto quando ti interessano ordine e posizione. Quando devi cercare qualcosa tramite una chiave, come un nome utente per trovare un utente o un codice prodotto per trovare un prezzo, ti serve una HashMap, che è la prossima pagina.

Domande frequenti

Come si crea un ArrayList in Java?

Dichiaralo con il tipo degli elementi tra parentesi angolari e chiama il costruttore: ArrayList<String> names = new ArrayList<>();. Il <> a destra (il diamond) permette a Java di dedurre il tipo. Di solito la variabile si dichiara con l'interfaccia List: List<String> names = new ArrayList<>();.

Qual è la differenza tra un array e un ArrayList in Java?

Un array semplice ha una lunghezza fissa, decisa al momento della creazione, e può contenere tipi primitivi come int. Un ArrayList cresce e si riduce in automatico quando aggiungi e rimuovi elementi, contiene solo oggetti (quindi int diventa Integer) e offre metodi come add, remove, contains e size. Usa un array per dati primitivi di dimensione fissa; usa un ArrayList quando la dimensione cambia.

Come si rimuove un elemento da un ArrayList?

Chiama remove(index) per rimuovere per posizione, oppure remove(object) per rimuovere il primo elemento corrispondente. Attenzione alle liste di Integer: list.remove(2) rimuove l'indice 2, mentre list.remove(Integer.valueOf(2)) rimuove il valore 2. Per rimuovere durante un ciclo, usa il remove() di un Iterator oppure removeIf(...) per evitare una ConcurrentModificationException.

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA