Ricerca nel sito web

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, non null o qualsiasi altra cosa che può essere verificata a livello di codice. In effetti, qualsiasi istruzione booleana potrebbe essere utilizzata, motivo per cui i cicli while 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 prompt jshell> e premendo INVIO. Per uscire da jshell, digita /exit.

    Per testare questo codice, incolla le seguenti righe in jshell:

    1. int x = 3;
    2. while (x > 0) {
    3. System.out.println("x is " + x--);
    4. }

    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 se x è maggiore di 0. 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 di x utilizzando il println(). (Per ulteriori informazioni sull'istruzione System.out.println, consulta il nostro tutorial Come scrivere il tuo primo programma in Java.) All'interno dell'argomento per println(), x è post-decrementato di 1 con il codice x--. Ad ogni esecuzione, x diminuisce di 1.

    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:

    Output
    x ==> 3 x is 3 x is 2 x is 1

    La prima riga conferma che x ha ricevuto il valore di 3. Nelle righe seguenti, il valore di x viene stampato tre volte, diminuendo ogni volta di 1. Ci sono solo tre iterazioni in cui x è uguale a 3, 2 e 1. Il ciclo si interrompe quando x raggiunge 0 perché l'istruzione condizionale x > 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 (come x > 0 e y < 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 cicli while, ma è ancora ampiamente utilizzato. Un ciclo do-while assomiglia a un ciclo while, 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 cicli do-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 cicli do-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 ciclo while nella sezione precedente. La variabile int si chiamerà x e avrà un valore iniziale di 3. 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 ciclo do-while:

    1. int x = 3;
    2. do {
    3. System.out.println("x is " + x--);
    4. } while (x < 0);

    Il codice ha alcune somiglianze con il ciclo while della sezione precedente. Innanzitutto, c'è l'assegnazione della variabile x, che è di nuovo 3.

    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 di x viene stampato usando il metodo println(). Con il metodo println(), decrementi anche il valore di x usando l'operatore di post-decremento --.

    Nell'ultima riga c'è la parentesi di chiusura } per il blocco di codice, seguita dalla parola chiave while con l'istruzione condizionale (x < 0). Questa è la parte che differisce dal precedente ciclo while. Qui, la condizione è invertita: x dovrebbe essere minore di 0. Nell'esempio precedente, la condizione richiedeva che x fosse maggiore di 0. 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:

    Output
    x ==> 3 x is 3

    La prima riga conferma che il valore di x è 3. La seconda riga stampa x is 3. Questa è la particolarità del ciclo do-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 cicli do-while. A causa di questo avvertimento, i cicli do-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 ciclo while. 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 ciclo for è più adatto quando vuoi scrivere il tuo codice aderendo a uno stile più rigoroso.

    Ecco un tipico ciclo for:

    1. for (int x = 3; x > 0; x--) {
    2. System.out.println("x is " + x);
    3. }

    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 ciclo while, 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 di 0. Questa parte è simile all'istruzione di controllo del ciclo while, 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 di x dopo ogni esecuzione riuscita.

    L'istruzione System.out.println(x is + x); alla riga 2 stampa il valore di x utilizzando println() metodo. Riceve il valore di x invariato. Al contrario, hai usato il metodo println() per manipolare il valore di x nel ciclo while. 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:

    Output
    x is 3 x is 2 x is 1

    L'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 diventa 0 e il ciclo termina senza eseguire il blocco di codice (che stampa il valore di x).

    Questo ciclo for ottiene lo stesso risultato del ciclo while. 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 ciclo for 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 ciclo foreach 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 chiave foreach dedicata, ma viene invece utilizzata la parola chiave for. Tuttavia, l'istruzione condizionale foreach differisce dal comune ciclo for, 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 valori int.

    Aggiungi il seguente codice per un ciclo foreach a jshell:

    1. int[] numbers = {0, 1, 2};
    2. for (int x: numbers) {
    3. System.out.println(x);
    4. }

    Nella prima riga, crei un array int contenente tre numeri interi (0, 1 e 2).

    Il ciclo foreach inizia alla riga 2 con la parola chiave for. Quindi, definisci una variabile temporanea int x, seguita da due punti. I due punti sono usati come scorciatoia per l'operazione foreach. (L'istruzione del ciclo foreach è 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'array numbers. In questo caso, l'istruzione System.out.println(x); stamperà il valore di x utilizzando il metodo println(), che farà riferimento a ciascun valore dell'array numbers.

    Quando esegui il codice precedente in jshell, viene stampato il seguente output:

    Output
    numbers ==> int[3] { 0, 1, 2 } 0 1 2

    La prima riga conferma che è stato definito un array chiamato numbers che contiene i valori 0, 1 e 2. Le righe seguenti stampano i valori dell'array, ciascuno su una nuova riga: 0, 1 e 2.

    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 ciclo foreach utilizzando un ciclo for o while, ma non ne vale la pena e richiede un profonda comprensione delle strutture dati.

    Cicli infiniti

    I cicli infiniti sono cicli for o while che non terminano mai. Diventano infiniti quando la condizione di controllo è sempre vera.

    Ecco un esempio comune di ciclo infinito while:

    1. while (true) {
    2. System.out.println("This will print forever.");
    3. }

    La prima riga sembra un tipico ciclo while, ma invece di una condizione come x > 0, c'è solo il valore true. 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'istruzione System.out.println(This will print forever.);; stamperà il testo Questo verrà stampato per sempre. usando il metodo println().

    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 tasti CTRL+C o semplicemente chiudi il terminale. Altrimenti, continuerà all'infinito:

    Output
    This 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:

    1. int x = 3;
    2. while (x > 0) {
    3. System.out.println("x is " + x);
    4. }

    Il codice sopra è simile al primo esempio in questo tutorial. Nella prima riga, definisci una variabile x con il valore 3.

    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 di x utilizzando println() metodo. Tuttavia, contrariamente all'esempio del ciclo while nella prima sezione di questo tutorial, in cui il ciclo terminava dopo tre esecuzioni, non c'è alcuna operazione di post-decremento per x nell'esempio corrente . Per questo motivo, quando esegui questo ciclo in jshell, otterrai il seguente output continuo:

    Output
    x 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 che x venga decrementato ad ogni ciclo per soddisfare la condizione di uscita dal ciclo x > 0.

    Conclusione

    In questo tutorial, hai utilizzato strutture di loop per creare attività ripetitive. Hai imparato quando è opportuno utilizzare i cicli while e for 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.