Il classico ciclo for in tre parti
Un ciclo for ripete un blocco un numero controllato di volte. La forma di Java racchiude tre elementi tra le parentesi, separati da punto e virgola:
Le tre parti vengono eseguite con un ritmo fisso:
- Inizializzazione (
int i = 0): viene eseguita una volta, prima di tutto il resto. - Condizione (
i < 5): viene controllata prima di ogni passaggio; il ciclo si ferma quando è falsa. - Aggiornamento (
i++): viene eseguito dopo ogni passaggio, prima di ricontrollare la condizione.
Quindi questo stampa da i = 0 a i = 4. Il contatore i esiste solo all'interno del ciclo: dopo la parentesi graffa di chiusura non c'è più.
Contare in avanti, all'indietro e a passi
Le tre parti ti danno il pieno controllo del contatore:
i-- decrementa, i += 5 salta a passi di cinque: sono entrambi operatori aritmetici che fanno i conti sul contatore. La condizione decide quando fermarsi in base alla direzione: usa > quando conti all'indietro, < o <= quando conti in avanti.
Scorrere un array
Un ciclo con contatore si abbina in modo naturale a un array, usando .length come limite e i come indice:
Nota che colors.length è un campo senza parentesi: gli array sono speciali in questo. Una List usa invece list.size(). La condizione i < colors.length è corretta: gli indici vanno da 0 a length - 1, quindi usare < (e non <=) evita un errore di indice fuori intervallo.
Il ciclo for-each migliorato
Quando ti serve solo ogni elemento e mai l'indice, il for migliorato è più pulito e più difficile da sbagliare: non c'è un contatore con cui commettere errori di uno:
Leggi for (String color : colors) come "per ogni color in colors". Funziona sugli array e su qualsiasi cosa iterabile. Il compromesso: non hai l'indice e non puoi aggiungere o rimuovere elementi dalla collezione durante il ciclo (farlo lancia un'eccezione a runtime, ConcurrentModificationException). Usa il ciclo con contatore quando ti serve una di queste due cose.
Cicli annidati
Un ciclo dentro un ciclo è utile per griglie, tabelle e abbinamenti. Il ciclo interno viene eseguito per intero a ogni passaggio di quello esterno:
Questo stampa una tabellina 3x3. Quando l'annidamento si fa profondo, dai ai contatori nomi significativi (row, col) invece di i, j: ti evita di confondere l'uno con l'altro.
break e continue
break esce subito dal ciclo. continue salta il resto del passaggio corrente e passa direttamente all'aggiornamento:
Questo stampa 1 3 5 7. continue salta i pari; break chiude il ciclo quando i supererebbe 7. Nei cicli annidati, entrambi agiscono solo sul ciclo più interno, a meno che tu non usi un break con etichetta.
Attenzione ai cicli infiniti
Se la condizione non diventa mai falsa, il ciclo gira per sempre. La causa tipica è dimenticare l'aggiornamento o spostare il contatore nella direzione sbagliata:
for (int i = 0; i < 5; i--) { // i diminuisce soltanto -> non arriva mai a 5
System.out.println(i);
}
Un ciclo infinito voluto omette tutte e tre le parti, for (;;) { ... }, e si affida a un break interno per fermarsi. Usalo con parsimonia; di solito un while (true) si legge meglio.
Prossimo passo: i cicli while
Il ciclo for dà il meglio quando conosci il contatore in anticipo. Quando vuoi ripetere finché una condizione non cambia, e non hai un contatore chiaro, il ciclo while è più adatto. È l'argomento della prossima pagina.
Domande frequenti
Qual è la sintassi di un ciclo for in Java?
Un ciclo for in Java ha tre parti tra parentesi separate da punto e virgola: for (initialization; condition; update) { ... }. Per esempio for (int i = 0; i < 5; i++) { ... } fa partire i da 0, esegue il corpo finché i < 5 e aggiunge 1 a i dopo ogni passaggio. Tutte e tre le parti sono facoltative.
Qual è la differenza tra un ciclo for e un ciclo for-each in Java?
Il classico ciclo for usa un contatore esplicito, quindi controlli tu l'indice e la direzione: è l'ideale quando ti serve l'indice o vuoi saltare elementi. Il ciclo for-each migliorato, for (Type item : collection), percorre ogni elemento in ordine senza indice: è più pulito quando ti serve solo ogni elemento e mai la posizione. Il for-each non può modificare la struttura della collezione durante il ciclo.
Come si scorre un array in Java?
Puoi usare gli indici con un ciclo con contatore, for (int i = 0; i < arr.length; i++) { use arr[i]; }, oppure, quando l'indice non ti serve, un for-each: for (int x : arr) { use x; }. Gli array espongono la loro dimensione tramite il campo .length (senza parentesi), mentre le liste usano .size().