Come utilizzare i loop in Java
L'autore ha selezionato il programma Write for DOnations.
introduzione
La scrittura di attività ripetitive è comune nella programmazione. Un'opzione è scrivere lo stesso codice o un codice simile tutte le volte necessarie per eseguire ripetutamente un blocco di codice. Questo approccio è tutt'altro che perfetto perché creerà molto codice duplicato difficile da leggere e mantenere. Un'opzione migliore è usare i loop.
I loop sono strutture per controllare il flusso ripetitivo del programma. Un ciclo tipico ha due parti. Una parte è una condizione di controllo booleana. L'altra parte è un blocco di codice che verrà eseguito mentre la condizione è vera o finché la condizione è falsa. La condizione booleana viene rivalutata a ogni esecuzione del blocco di codice. I criteri di uscita dal ciclo sono diversi per ogni tipo di ciclo, come imparerai in questo tutorial.
Esistono due tipi principali di cicli: while
e for
. Il tipo dipende dalla sintassi e dalla logica del ciclo. I cicli while
dipendono da una condizione booleana. Questa condizione potrebbe essere generale e mentre è vera, il blocco di codice viene eseguito ripetutamente. Anche i cicli for
eseguono ripetutamente un blocco di codice, ma la condizione del ciclo dipende tipicamente dall'incremento o dal decremento di una variabile intera. Quando questa variabile raggiunge un determinato valore target, il ciclo si interrompe.
In questo tutorial, utilizzerai i cicli while
e for
per creare attività ripetitive e conoscere i vantaggi e gli svantaggi di ciascuna di esse.
Prerequisiti
Per seguire questo tutorial, avrai bisogno di:
- Un ambiente in cui è possibile eseguire programmi Java da seguire insieme agli esempi. Per configurarlo sul tuo computer locale, avrai bisogno di quanto segue:
- Java (versione 11 o successiva) installato sulla tua macchina, con il compilatore fornito dal Java Development Kit (JDK). Per Ubuntu e Debian, segui i passaggi per le opzioni di download per l'installazione di Java.
- Per compilare ed eseguire gli esempi di codice, questo tutorial utilizza la guida Introduzione alla JShell.
Familiarità con Java e programmazione orientata agli oggetti, che puoi trovare nel nostro tutorial How To Write Your First Program in Java.
Una comprensione dei tipi di dati Java, discussa nel nostro tutorial Comprensione dei tipi di dati in Java.
mentre Loop
I cicli
while
monitorano un'istruzione condizionale booleana generica. Ad esempio, l'istruzione condizionale potrebbe verificare se due variabili intere sono uguali o se due oggetti sono uguali, correlati, nonnull
o qualsiasi altra cosa che può essere verificata a livello di codice. In effetti, qualsiasi istruzione booleana potrebbe essere utilizzata, motivo per cui i cicliwhile
sono così potenti e utilizzati universalmente.In questa sezione, creerai il tuo primo ciclo di programmazione in Java utilizzando la parola chiave
while
. Utilizzerai una singola operazione di post-decremento per terminare il ciclo corrente dopo alcune esecuzioni. Senza di esso, il ciclo continuerà all'infinito.Informazioni: per seguire il codice di esempio in questo tutorial, apri lo strumento JShell sul tuo sistema locale eseguendo il comando
jshell
. Quindi puoi copiare, incollare o modificare gli esempi aggiungendoli dopo il promptjshell>
e premendoINVIO
. Per uscire dajshell
, digita/exit
.Per testare questo codice, incolla le seguenti righe in
jshell
:- int x = 3;
- while (x > 0) {
- System.out.println("x is " + x--);
- }
Nella prima riga, definisci la variabile
x
.Il ciclo inizia alla riga 2 con la parola chiave
while
. L'istruzione condizionale(x > 0)
controlla il ciclo. Confronta sex
è maggiore di0
. Dopo di che viene la parentesi di apertura{
, che denota l'inizio del blocco di codice. Questo blocco di codice verrà eseguito ripetutamente mentre la condizione è vera (x > 0
).All'interno del blocco di codice, l'istruzione
System.out.println(x is + x--);
alla riga 3 stampa il valore corrente dix
utilizzando ilprintln()
. (Per ulteriori informazioni sull'istruzioneSystem.out.println
, consulta il nostro tutorial Come scrivere il tuo primo programma in Java.) All'interno dell'argomento perprintln()
,x
è post-decrementato di1
con il codicex--
. Ad ogni esecuzione,x
diminuisce di1
.Il blocco di codice termina nell'ultima riga con la parentesi di chiusura
}
. Questa è anche la fine del ciclo.Quando esegui questo codice in
jshell
, verrà stampato il seguente output:Outputx ==> 3 x is 3 x is 2 x is 1La prima riga conferma che
x
ha ricevuto il valore di3
. Nelle righe seguenti, il valore dix
viene stampato tre volte, diminuendo ogni volta di1
. Ci sono solo tre iterazioni in cuix
è uguale a3
,2
e1
. Il ciclo si interrompe quandox
raggiunge0
perché l'istruzione condizionalex > 0
non è più soddisfatta. A questo punto il ciclo termina e non viene stampato nient'altro.L'esempio precedente è un modo comune per creare un loop. L'intenzione del ciclo è chiara e la condizione di uscita è semplice:
x > 0
. In teoria, potresti rendere la condizione più complessa aggiungendo ulteriori variabili e confronti (comex > 0
ey < 0
), ma questa non è considerata una best practice dal punto di vista del codice pulito. Le condizioni complesse rendono il codice difficile da seguire e comprendere, apportando poco o nessun valore.Do-while Loop
Il ciclo
do-while
è meno popolare dei cicliwhile
, ma è ancora ampiamente utilizzato. Un ciclodo-while
assomiglia a un ciclowhile
, ma differiscono in un aspetto chiave: il blocco di codice viene eseguito per primo e quindi viene valutata la condizione del ciclo.Come promemoria, i cicli
while
prima valutano la condizione e potrebbero non eseguire mai il blocco di codice se la condizione non è soddisfatta. Nei ciclido-while
, tuttavia, c'è sempre almeno un'esecuzione del blocco di codice prima che venga valutata la condizione di controllo del ciclo. Se la condizione è vera, il ciclo continuerà ulteriori iterazioni finché non sarà più vera. Per questo motivo, i ciclido-while
sono utili in casi come porre una domanda e far terminare il ciclo solo dopo la risposta corretta.In questa sezione, creerai un ciclo
do-while
simile al ciclowhile
nella sezione precedente. La variabileint
si chiameràx
e avrà un valore iniziale di3
. Questa volta, tuttavia, la condizione viene invertita (x < 0
) e il blocco di codice verrà eseguito prima che la condizione venga valutata.Apri
jshell
e aggiungi il ciclodo-while
:- int x = 3;
- do {
- System.out.println("x is " + x--);
- } while (x < 0);
Il codice ha alcune somiglianze con il ciclo
while
della sezione precedente. Innanzitutto, c'è l'assegnazione della variabilex
, che è di nuovo3
.Alla riga 2, il ciclo inizia con la parola chiave
do
e la parentesi di apertura{
per il blocco di codice. Alla riga 3, il valore dix
viene stampato usando il metodoprintln()
. Con il metodoprintln()
, decrementi anche il valore dix
usando l'operatore di post-decremento--
.Nell'ultima riga c'è la parentesi di chiusura
}
per il blocco di codice, seguita dalla parola chiavewhile
con l'istruzione condizionale(x < 0)
. Questa è la parte che differisce dal precedente ciclowhile
. Qui, la condizione è invertita:x
dovrebbe essere minore di0
. Nell'esempio precedente, la condizione richiedeva chex
fosse maggiore di0
. Questa modifica dimostra che il blocco di codice verrà eseguito una volta anche se la condizione non è mai soddisfatta.Quando esegui questo codice in
jshell
, verrà stampato il seguente output:Outputx ==> 3 x is 3La prima riga conferma che il valore di
x
è3
. La seconda riga stampax is 3
. Questa è la particolarità del ciclodo-while
: anche se la condizione (x < 0
) non è soddisfatta, il blocco di codice viene comunque eseguito almeno una volta. Questa esecuzione incondizionata potrebbe non essere sempre desiderata, motivo per cui devi stare attento quando usi i ciclido-while
. A causa di questo avvertimento, i ciclido-while
non vengono usati così spesso.per Loop
Una struttura di ciclo alternativa è il ciclo
for
. Viene anche usato per eseguire ripetutamente un blocco di codice sotto una condizione, ma ha più opzioni di un ciclowhile
. Nella condizione di controllo del ciclo è possibile aggiungere la variabile temporanea, definire la condizione di controllo e modificare il valore della variabile temporanea. In questo modo, leghi insieme tutti i fattori che controllano il loop, rendendo meno probabile che manchi qualcosa o commetta un errore. Ciò consente di mantenere il codice pulito e comprensibile. Il ciclofor
è più adatto quando vuoi scrivere il tuo codice aderendo a uno stile più rigoroso.Ecco un tipico ciclo
for
:- for (int x = 3; x > 0; x--) {
- System.out.println("x is " + x);
- }
Il ciclo inizia con la parola chiave
for
sulla prima riga. L'istruzione condizionale tra parentesi ha tre parti:int x=3
definisce una variabile (x
). Definire una variabile temporanea qui è conveniente perché sono necessarie solo per il ciclo, quindi ha senso integrarle nel ciclo. Al contrario, quando utilizzavi un ciclowhile
, dovevi dichiarare la variabile separatamente prima del ciclo.x > 0
è la condizione che deve essere soddisfatta affinché il blocco di codice venga eseguito. In questo caso,x
deve essere maggiore di0
. Questa parte è simile all'istruzione di controllo del ciclowhile
, che contiene solo la condizione da valutare.x--
è l'azione intrapresa durante ogni iterazione riuscita. In questo caso, un'operazione di post-decremento diminuisce il valore dix
dopo ogni esecuzione riuscita.
L'istruzione
System.out.println(x is + x);
alla riga 2 stampa il valore dix
utilizzandoprintln()
metodo. Riceve il valore dix
invariato. Al contrario, hai usato il metodoprintln()
per manipolare il valore dix
nel ciclowhile
. Questo non è necessario qui perché l'operazione di post-decremento è già curata nella terza parte dell'istruzione condizionale:x--
.La riga 3 termina il blocco di codice e l'intera struttura del ciclo con la parentesi di chiusura
}
.Quando esegui questo codice in
jshell
, viene stampato il seguente output:Outputx is 3 x is 2 x is 1L'output conferma che il blocco di codice è stato eseguito tre volte. La prima volta, il valore di
x
è3
. La seconda volta,x
è2
, e la terza volta,x
è1
. Dopo la terza volta,x
diventa0
e il ciclo termina senza eseguire il blocco di codice (che stampa il valore dix
).Questo ciclo
for
ottiene lo stesso risultato del ciclowhile
. Dal punto di vista delle prestazioni e dell'utilizzo delle risorse, non dovrebbero esserci differenze, quindi è principalmente una questione di preferenza personale quale ciclo utilizzare. Tuttavia, se si conosce il numero di iterazioni, di solito si preferisce il ciclofor
perché consente di seguire il codice più da vicino.foreach Loop
Un ciclo
foreach
è simile agli altri cicli, ma il suo vantaggio è che è specificamente progettato per iterare su un gruppo di valori con il minor codice possibile. Finché hai un gruppo di valori, puoi esaminarli senza dover tenere traccia del loro numero o seguire l'avanzamento dell'iterazione. Il cicloforeach
assicurerà che se ci sono valori nel gruppo, verranno estratti uno per uno e presentati a te.La maggior parte dei linguaggi di programmazione ha una comoda scorciatoia per il ciclo
foreach
. In Java, non esiste una parola chiaveforeach
dedicata, ma viene invece utilizzata la parola chiavefor
. Tuttavia, l'istruzione condizionaleforeach
differisce dal comune ciclofor
, come scoprirai in seguito.Per lavorare con i cicli
foreach
, devi usare un gruppo di valori e un array è adatto a questo scopo. Un array è un oggetto che contiene valori dello stesso tipo. Nell'esempio seguente, utilizzerai un array contenente valoriint
.Aggiungi il seguente codice per un ciclo
foreach
ajshell
:- int[] numbers = {0, 1, 2};
- for (int x: numbers) {
- System.out.println(x);
- }
Nella prima riga, crei un array
int
contenente tre numeri interi (0
,1
e2
).Il ciclo
foreach
inizia alla riga 2 con la parola chiavefor
. Quindi, definisci una variabile temporaneaint x
, seguita da due punti. I due punti sono usati come scorciatoia per l'operazioneforeach
. (L'istruzione del cicloforeach
è unica perché questo è l'unico punto in Java in cui vengono utilizzati i due punti.) Dopo i due punti c'è una raccolta di valori, come un array.Dopo l'istruzione del ciclo
foreach
c'è il blocco di codice che verrà eseguito per ogni valore dell'arraynumbers
. In questo caso, l'istruzioneSystem.out.println(x);
stamperà il valore dix
utilizzando il metodoprintln()
, che farà riferimento a ciascun valore dell'arraynumbers
.Quando esegui il codice precedente in
jshell
, viene stampato il seguente output:Outputnumbers ==> int[3] { 0, 1, 2 } 0 1 2La prima riga conferma che è stato definito un array chiamato
numbers
che contiene i valori0
,1
e2
. Le righe seguenti stampano i valori dell'array, ciascuno su una nuova riga:0
,1
e2
.Mentre l'uso degli altri cicli è principalmente una questione di scelta personale, il ciclo
foreach
è lo standard de facto per l'iterazione su un gruppo di valori. È possibile creare la propria alternativa al cicloforeach
utilizzando un ciclofor
owhile
, ma non ne vale la pena e richiede un profonda comprensione delle strutture dati.Cicli infiniti
I cicli infiniti sono cicli
for
owhile
che non terminano mai. Diventano infiniti quando la condizione di controllo è sempre vera.Ecco un esempio comune di ciclo infinito
while
:- while (true) {
- System.out.println("This will print forever.");
- }
La prima riga sembra un tipico ciclo
while
, ma invece di una condizione comex > 0
, c'è solo il valoretrue
. In questo caso, quando deve essere valutata una condizione di controllo,true
viene sempre restituito direttamente. In questo caso, non c'è uscita per il ciclo, quindi continuerà per sempre. La seconda riga contiene l'istruzioneSystem.out.println(This will print forever.);
; stamperà il testoQuesto verrà stampato per sempre.
usando il metodoprintln()
.Quando esegui il codice precedente in
jshell
, il seguente output verrà stampato finché non termini il codice. Preparati a terminarlo rapidamente con la combinazione di tastiCTRL+C
o semplicemente chiudi il terminale. Altrimenti, continuerà all'infinito:OutputThis will print forever. This will print forever. ...Vengono mostrate solo le prime due ripetizioni, ma questo output continuerà finché non premi
CTRL+C
per terminarlo manualmente.Con l'esempio di ciclo infinito, c'è una chiara intenzione di creare un tale ciclo a causa del singolo valore
true
posto al posto di un'istruzione booleana. Tali loop erano popolari in passato e potrebbero essere presenti in progetti legacy. Puoi ancora creare tali cicli infiniti, ma ci sono modi migliori per creare attività in esecuzione continua, ad esempio con le attività Timer. Le attivitàTimer
sono preferite perché sono più sofisticate e offrono più opzioni.Sfortunatamente, a volte i loop infiniti non sono intenzionali. Potresti commettere un errore e causare un ciclo infinito. Considera il seguente codice:
- int x = 3;
- while (x > 0) {
- System.out.println("x is " + x);
- }
Il codice sopra è simile al primo esempio in questo tutorial. Nella prima riga, definisci una variabile
x
con il valore3
.Alla riga 2 c'è la parola chiave
while
e la condizione di controllo, che indica che il ciclo deve continuare finchéx > 0
è vero.L'istruzione
System.out.println(x is + x);
alla riga 3 stampa il valore dix
utilizzandoprintln()
metodo. Tuttavia, contrariamente all'esempio del ciclowhile
nella prima sezione di questo tutorial, in cui il ciclo terminava dopo tre esecuzioni, non c'è alcuna operazione di post-decremento perx
nell'esempio corrente . Per questo motivo, quando esegui questo ciclo injshell
, otterrai il seguente output continuo:Outputx is 3 x is 3 ...Queste righe si ripeteranno all'infinito finché non terminerai il ciclo con
CTRL+C
. Tali cicli infiniti non intenzionali sono pericolosi perché possono causare l'arresto anomalo di un programma o il sovraccarico della macchina che esegue il programma. Ecco perché dovresti fare attenzione quando crei loop e assicurarti che ci sia un percorso di terminazione praticabile. Nell'esempio corrente, dovresti assicurarti chex
venga decrementato ad ogni ciclo per soddisfare la condizione di uscita dal ciclox > 0
.Conclusione
In questo tutorial, hai utilizzato strutture di loop per creare attività ripetitive. Hai imparato quando è opportuno utilizzare i cicli
while
efor
e hai scritto alcuni esempi di codice con essi. Hai anche appreso le migliori pratiche per il codice pulito e come evitare le insidie comuni relative ai loop.Per ulteriori informazioni su Java, consulta la nostra serie How To Code in Java.