W3docs

Цикл for в Java

Выполняйте итерации фиксированное число раз с помощью цикла for в Java: инициализация, условие и выражение обновления.

Цикл for — рабочая лошадка итерации в Java. Он объединяет три части — что делать до цикла, что проверять перед каждой итерацией и что делать после каждой итерации — в единый заголовок. Результат получается компактнее и надёжнее, чем аналогичная запись через while.

Синтаксис

for (initialization; condition; update) {
  // body
}

Три части, разделённые точкой с запятой:

  1. Инициализация — выполняется один раз перед началом цикла. Как правило, объявляет счётчик.
  2. Условие — проверяется перед каждой итерацией. Если ложно, цикл завершается.
  3. Обновление — выполняется после каждой итерации. Как правило, увеличивает счётчик.
for (int i = 0; i < 5; i++) {
  System.out.println(i);
}

Выводит 0 1 2 3 4. Заголовок читается как: начать с i = 0, выполнять, пока i < 5, увеличивать i каждый раз.

Эквивалентная форма через while

Цикл for механически эквивалентен следующему циклу while:

{
  int i = 0;            // initialization
  while (i < 5) {       // condition
    System.out.println(i);
    i++;                // update
  }
}

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

Варианты счёта

Заголовок for гибок. Три части могут быть любыми:

// counting down
for (int i = 10; i > 0; i--) { ... }

// stepping by 2
for (int i = 0; i < 100; i += 2) { ... }

// looping over an array by index
for (int i = 0; i < arr.length; i++) {
  System.out.println(arr[i]);
}

Если какая-то часть не нужна, её можно опустить — но точки с запятой нужно сохранить:

for (;;) {              // identical to while (true)
  if (done()) break;
}

Ошибка на единицу

Наиболее распространённая ошибка в цикле for — выбор неправильного оператора сравнения. При индексировании массива длиной n допустимые индексы находятся в диапазоне от 0 до n - 1, поэтому условие должно быть i < n (а не i <= n):

int[] arr = {10, 20, 30};   // length 3, indices 0..2
for (int i = 0; i <= arr.length; i++) {
  System.out.println(arr[i]);   // throws ArrayIndexOutOfBoundsException when i == 3
}

Замена <= на < исправляет проблему. Простое правило: используйте < со счётчиком или length, а <= оставьте для явного последнего значения (например, for (int i = 1; i <= 5; i++)).

Область видимости переменной цикла

Переменная, объявленная в секции инициализации, локальна для цикла. После завершения цикла она недоступна:

for (int i = 0; i < 5; i++) {
  // i is visible here
}
// i is not visible here

Это сделано намеренно — чтобы предотвратить случайное использование конечного значения счётчика. Если значение нужно за пределами цикла, объявите переменную заранее:

int i;
for (i = 0; i < 5; i++) {
  if (someCondition(i)) break;
}
System.out.println("stopped at i=" + i);

Несколько переменных в одном заголовке

Можно объявить и обновлять более одной переменной, разделяя их запятыми:

for (int i = 0, j = 10; i < j; i++, j--) {
  System.out.println(i + " " + j);
}

Иногда полезно — но если в цикле взаимодействуют больше двух переменных, это обычно сигнал рефакторить код на более мелкие части.

Когда выбирать for вместо while

Используйте цикл for, когда вы знаете — или можете выразить в одной строке — сколько итераций нужно или какой диапазон обходится. Используйте цикл while, когда условие остановки не связано со счётчиком (например, «пока не закончится ввод», «до успеха»).

Для обхода элементов массива или коллекции один за одним расширенный цикл for-each почти всегда чище.

Рабочий пример

java— editable, runs on the server

Что дальше

Когда нужно просто перебрать все элементы массива или коллекции без управления индексом, подходящий инструмент — цикл for-each.

Практика

Практика
Что выведет for (int i = 0; i < 5; i += 2) System.out.print(i); ?
Что выведет for (int i = 0; i < 5; i += 2) System.out.print(i); ?
Was this page helpful?