Если нужен короткий ответ: цикл это управляющая конструкция, которая заставляет один и тот же участок кода выполниться несколько раз подряд. В Java таких конструкций четыре: while, do..while, for и for each. Отличаются они тем, когда проверяется условие и откуда берется число повторов.

Кратко

  • Цикл повторяет один и тот же блок кода, пока выполняется его условие. Один проход называют итерацией, а повторяемый блок телом цикла.
  • while проверяет условие до тела, поэтому может не выполниться ни разу.
  • do..while проверяет условие после тела, поэтому выполнится хотя бы один раз.
  • for держит счетчик прямо в заголовке: инициализация, условие, шаг. Его берут, когда число повторов известно заранее или когда нужен индекс.
  • for each перебирает готовый массив или коллекцию целиком, без счетчика и без индекса.
  • Прервать цикл досрочно можно оператором break, пропустить остаток текущей итерации оператором continue. Если условие никогда не станет ложным, цикл будет бесконечным.

Что такое циклы

Программа, написанная на языке Java, состоит из определенного кода. Обычно он выполняется последовательно: строка за строкой, сверху вниз. Но есть и такие конструкции кода, которые меняют линейное выполнение программы. Их называют управляющими конструкциями. Колесо обозрения в парке аттракционов, снятое с длинной выдержкой: от вращения огни слились в сплошные светящиеся кругиБлагодаря им, код можно выполнять выборочно. Например, запустить один блок кода вместо другого. Циклы это разновидность управляющих конструкций для организации многократного выполнения одного и того же участка кода. Код внутри такой управляющей конструкции выполняется циклично. Каждое выполнение кода это итерация цикла. Количество итераций регулируется условием цикла. Код, который выполняется внутри цикла, называют телом цикла. Известны такие виды циклов:
  1. Циклы с предусловием: условие выполнения определяется перед первой итерацией.

  2. Циклы с постусловием: условие выполнения определяется после первой итерации (поэтому они всегда выполняются минимум один раз). Полезны, когда нужно выполнять некое действие, пока не реализуется некое условие: например, считывать ввод пользователя, пока он не введет слово “stop”.

  3. Циклы со счетчиком: количество итераций определяется смоделированным счетчиком. В условии цикла задается его начальное и конечное значение. Каждую итерацию счетчик наращивается. Мы можем заранее определить количество итераций.

    Эти циклы бывают полезны, когда нужно перебрать все элементы в какой-то коллекции. Циклы со счетчиком называют “циклами для...”. “Для каждого элемента некоторой коллекции осуществить следующие действия”.

    Допустимы случаи, когда выполнение цикла можно прервать до достижения его условия. Например, если у нас есть коллекция из 100 чисел и нам необходимо понять, содержит ли она отрицательные числа. Мы можем начать перебор всех чисел, используя цикл “для”. Но когда мы найдем первое отрицательное число, нам не обязательно перебирать оставшиеся числа. Мы можем прервать выполнение цикла, если его дальнейшее выполнение не имеет смысла. Подобные ситуации называют прерыванием цикла.

  4. Безусловные циклы это циклы, которые выполняются бесконечно. Например: “Пока 1=1, печатать «1=1»”. Такая программа будет выполняться, пока ее вручную не прервут.

    Данные циклы тоже бывают полезны, когда используются вместе с прерыванием цикла “изнутри”. Используйте их осторожно, чтобы не спровоцировать зависание программы.

    Подробнее с циклами в языке программирования Java можно познакомиться на 4-ом уровне курса JavaRush. В частности, с циклами while и for.

Циклы в Java

Теперь рассмотрим циклы в Java. В этом ЯП есть несколько типов циклов:
  • while это цикл с предусловием;
  • do..while это цикл с постусловием;
  • for это цикл со счетчиком (цикл для);
  • for each.. это цикл “для каждого…”, разновидность for для перебора коллекции элементов.
while, do..while и for можно использовать в качестве безусловных циклов. Сравнить синтаксис циклов в разных языках программирования можно на четвертом уровне обучения курса JavaRush. Например, циклов for и while. Рассмотрим кратко каждый из представленных типов.

Цикл while

Этот цикл в Java структурно выглядит так:

while (expression) {
     statement(s)
}
Здесь:
  • expression это условие цикла, выражение, которое должно возвращать boolean значение.
  • statement(s) это тело цикла (одна или более строк кода).
Перед каждой итерацией будет вычисляться значение выражения expression. Если результатом выражения будет true, выполняется тело цикла, то есть statement(s). Пример:

public class WhileExample {
    public static void main(String[] args) {
        int countDown = 10;

        while (countDown >= 0) {
            System.out.println("До старта: " + countDown);
            countDown --;
        }

        System.out.println("Поехали !");
        
    }
}
Вывод:

До старта: 10
До старта: 9
До старта: 8
До старта: 7
До старта: 6
До старта: 5
До старта: 4
До старта: 3
До старта: 2
До старта: 1
До старта: 0
Поехали !
Используя while, можно создать бесконечный цикл:

while (true) {
    // тело цикла
}
Чтобы прервать выполнение цикла, используется оператор break. Например:

public class WhileExample {
    public static void main(String[] args) {

        int count = 1;
        while (true) {
            System.out.println("Строка №" + count);
            if (count > 3) {
                break;
            }
            count++; // Без наращивания цикл будет выполняться вечно
        }

    }
}
Вывод:

Строка №1
Строка №2
Строка №3
Строка №4
Есть и второй оператор для управления ходом цикла, continue. Он не выходит из цикла, а прерывает только текущую итерацию: остаток тела пропускается, и управление сразу переходит к следующей проверке условия.

public class ContinueExample {
    public static void main(String[] args) {

        int count = 0;
        while (count < 5) {
            count++;
            if (count == 3) {
                continue; // пропускаем тройку, остаток тела не выполнится
            }
            System.out.println("Строка №" + count);
        }

    }
}
Вывод:

Строка №1
Строка №2
Строка №4
Строка №5
Обратите внимание, что счетчик наращивается до continue. Если поставить инкремент после него, оператор перепрыгнет через наращивание и цикл зависнет. Если циклы вложены друг в друга, break и continue действуют только на тот цикл, внутри которого написаны. Чтобы выйти сразу из внешнего цикла, перед ним ставят метку и пишут break имяМетки. Попрактиковаться в написании своих циклов можно уже на 4-ом уровне курса JavaRush.

Цикл do..while

Структура do..while выглядит так:

do {
     statement(s)
} while (expression);
Здесь:
  • expression это условие цикла, выражение, которое должно возвращать boolean значение.
  • statement(s) это тело цикла (одна или более строк кода).
В отличие от while, значение expression будет вычисляться после каждой итерации. Если результатом выражения будет true, в очередной раз выполнится тело цикла, то есть statement(s) (как минимум раз). Пример:

public class DoWhileExample {
    public static void main(String[] args) {
        int count = 1;
        do {
            System.out.println("count = " + count);
            count ++;
        } while (count < 11);
    }
}
Вывод:

count = 1
count = 2
count = 3
count = 4
count = 5
count = 6
count = 7
count = 8
count = 9
count = 10

Цикл for

Этот Java цикл выглядит так:

for (initialization; termination; increment) {
    statement(s)
}
Здесь:
  • initialization это выражение, которое инициализирует выполнение цикла. Исполняется только раз в начале цикла. Чаще всего в данном выражении инициализируют счетчик цикла.
  • termination это boolean выражение, которое регулирует окончание выполнения цикла. Если результат выражения будет равен false, цикл for прервется.
  • increment это выражение, которое исполняется после каждой итерации цикла. Чаще всего в данном выражении происходит инкрементирование или декрементирование переменной счетчика.
  • statement(s) это тело цикла.
Выражения initialization, termination, increment опциональны. Если опустить каждое из них, мы получим бесконечный цикл:

// бесконечный цикл
for ( ; ; ) {
    // код тела цикла
}
Пример цикла for:

public class ForExample {

    public static void main(String[] args) {
        for (int i = 1; i < 6; i++) {
            System.out.println("Строка №" + i);
        }
    }
}
Вывод:

Строка №1
Строка №2
Строка №3
Строка №4
Строка №5
Практикум по циклу for представлен на четвертом уровне курса JavaRush.

Цикл for each

Этот цикл Java это разновидность цикла for для итерации коллекций и массивов. Структура for each выглядит так:

for (Type var : vars) {
    statement(s)
}
Здесь:
  • vars это переменная, существующий список или массив.
  • Type var это объявление новой переменной, ее тип Type должен совпадать с типом элементов массива или коллекции vars.
Данную конструкцию можно прочитать так: “Для каждого var из vars сделать...”. Предположим, у нас есть массив строк из названий дней недели. Выведем каждый элемент этого массива на печать:

public class ForExample {

    public static void main(String[] args) {
        String[] daysOfWeek =
                { "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота", "Воскресенье" };
        
        
        for (String dayOfWeek : daysOfWeek) {
            System.out.println(dayOfWeek);
        }
    }
}
Вывод:

Понедельник
Вторник
Среда
Четверг
Пятница
Суббота
Воскресенье

Какой цикл выбрать

Все четыре цикла делают одно и то же, повторяют код, но подходят для разных задач. Вот сводка.
ЦиклГде проверяется условиеМинимум проходовКогда брать
whileперед телом0число повторов заранее неизвестно
do..whileпосле тела1тело обязано выполниться хотя бы раз: меню, чтение ввода
forперед телом, счетчик описан в заголовке0число повторов известно или нужен индекс
for eachусловия нет, обход идет до конца источника0надо просто перебрать весь массив или коллекцию

Вопросы и ответы

Чем while отличается от do..while?

while проверяет условие до тела цикла, поэтому при ложном условии тело не выполнится ни разу. do..while проверяет условие после тела, поэтому один проход происходит в любом случае.

Какой цикл выбрать, если число повторов известно заранее?

for: в его заголовке сразу видны начальное значение счетчика, условие продолжения и шаг. Если же число повторов зависит от данных или от ввода пользователя, удобнее while.

Как прервать цикл досрочно?

Оператором break: он немедленно выходит из цикла. Если нужно пропустить только текущую итерацию и перейти к следующей, берут continue. Во вложенных циклах break прерывает лишь тот цикл, в котором он написан, а чтобы выйти из внешнего, используют метку.

Что такое бесконечный цикл и как его получить?

Это цикл, условие которого никогда не становится ложным. В Java его пишут как while (true) или как for ( ; ; ) с пустыми выражениями. Выходят из такого цикла через break внутри тела, иначе программа зависнет.

Чем for each отличается от обычного for?

В for each нет счетчика и индекса: переменная на каждом шаге получает сам элемент. Поэтому им нельзя пройти массив с конца, заменить его элементы или узнать позицию найденного элемента. Зато код короче, и в границах сложнее ошибиться.

Сколько раз выполнится цикл, если условие ложно с самого начала?

while, for и for each не выполнятся ни разу, ведь условие проверяется до тела. do..while выполнится один раз, потому что его условие проверяется уже после первого прохода. Источник: Oracle Java Tutorials: Control Flow Statements.

Читайте также

Циклы Java изучаются на курсе JavaRush на четвертом уровне квеста Java Syntax. Попробуйте свои силы в решении задач по этой теме :)