Циклы

Базовый Java
≈ 3 мин чтения

Когда действие нужно повторить

Представь, что нужно вывести числа от 1 до 100. Можно написать сто вызовов System.out.println(), но такой код будет длинным, однообразным и неудобным для изменений. Цикл позволяет описать повторяющееся действие один раз и указать, пока или сколько раз его нужно выполнять.

В Java чаще всего используются три формы цикла: while, do-while и for. Они решают одну общую задачу — повторяют блок кода, — но удобны в разных ситуациях.

Цикл while

while подходит, когда повторение должно продолжаться, пока некоторое условие истинно. Условие проверяется до выполнения тела цикла, поэтому цикл может не выполниться ни разу.

int remaining = 3;

while (remaining > 0) {
    System.out.println(remaining);
    remaining--;
}

System.out.println("Go!");

Сначала проверяется remaining > 0. Если условие истинно, выполняется тело цикла, после чего проверка повторяется. Когда значение становится равным нулю, условие становится ложным и выполнение продолжается после цикла.

Следи за тем, что меняет условие цикла. Если написать while (remaining > 0), но никогда не уменьшать remaining, условие так и останется истинным и цикл станет бесконечным.

Цикл do-while

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

int attempts = 0;

do {
    System.out.println("Attempt " + attempts);
    attempts++;
} while (attempts < 3);

Сначала выполняется код внутри do, затем проверяется условие. Если оно истинно, начинается следующая итерация. Обрати внимание на точку с запятой после while (attempts < 3); — она является частью синтаксиса do-while.

Цикл for

for особенно удобен, когда есть счётчик и заранее понятно, как он должен изменяться от итерации к итерации. В заголовке цикла рядом находятся начальное действие, условие продолжения и действие после каждой итерации.

for (int i = 1; i <= 3; i++) {
    System.out.println(i);
}

Здесь int i = 1 выполняется один раз перед началом цикла. Перед каждой итерацией проверяется i <= 3, а после выполнения тела срабатывает i++. В результате в консоль выводятся числа 1, 2 и 3.

Счётчик, объявленный в заголовке for, существует только внутри этого цикла. После закрывающей фигурной скобки обратиться к i уже нельзя.

break и continue

Обычно цикл заканчивается, когда его условие становится ложным. Иногда завершить его нужно раньше. Для этого используется break.

for (int number = 1; number <= 10; number++) {
    if (number == 4) {
        break;
    }

    System.out.println(number);
}

Как только number становится равен 4, break немедленно завершает ближайший цикл. Код после цикла продолжит выполняться как обычно.

continue делает другое: текущая итерация прекращается, но сам цикл продолжается со следующей итерации.

for (int number = 1; number <= 5; number++) {
    if (number == 3) {
        continue;
    }

    System.out.println(number);
}

Число 3 не будет выведено: на этой итерации continue пропускает оставшуюся часть тела цикла. Затем for переходит к следующему значению счётчика.

Цикл внутри цикла

Циклы можно вкладывать друг в друга. Тогда для каждой итерации внешнего цикла внутренний цикл проходит все свои итерации.

for (int row = 1; row <= 2; row++) {
    for (int column = 1; column <= 3; column++) {
        System.out.println(row + ":" + column);
    }
}

Внешний цикл выполняется два раза. На каждом его шаге внутренний цикл выполняется три раза, поэтому строка System.out.println() сработает всего шесть раз. Такая схема пригодится, когда нужно повторять действие сразу по двум уровням счётчиков.