Циклы
Когда действие нужно повторить
Представь, что нужно вывести числа от 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() сработает всего шесть раз.
Такая схема пригодится, когда нужно повторять действие сразу по двум уровням счётчиков.