Цикл for в Java

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

В Java различают классический for с инициализацией, условием и шагом и enhanced for (for-each) — упрощённый цикл для прохода по массиву или коллекции. Обе формы компилируются в одно и то же по логике, но for-each более лаконичен и безопаснее.

Синтаксис

// Классический
for (инициализация; условие; шаг) {
    // тело
}

// for-each
for (Тип элемент : коллекция) {
    // тело
}

Пример 1. Печать чисел от 1 до 5

public class ForBasic {
    public static void main(String[] args) {
        for (int i = 1; i <= 5; i++) {
            System.out.println("i = " + i);
        }
    }
}

Вывод:

i = 1
i = 2
i = 3
i = 4
i = 5

Пример 2. Сумма от 1 до 10

public class Sum {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 10; i++) {
            sum += i;
        }
        System.out.println("Сумма = " + sum);
    }
}

Вывод:

Сумма = 55

Пример 3. Обратный отсчёт

public class Countdown {
    public static void main(String[] args) {
        for (int i = 5; i >= 1; i--) {
            System.out.println(i + "...");
        }
        System.out.println("Старт!");
    }
}

Вывод:

5...
4...
3...
2...
1...
Старт!

Пример 4. for-each по массиву

public class ForEach {
    public static void main(String[] args) {
        int[] sensors = {512, 480, 600, 350};
        int total = 0;
        for (int v : sensors) {
            total += v;
        }
        System.out.println("Среднее: " + (total / sensors.length));
    }
}

Вывод:

Среднее: 485

Пример 5. Вложенные циклы (таблица умножения)

public class MultTable {
    public static void main(String[] args) {
        for (int i = 1; i <= 3; i++) {
            for (int j = 1; j <= 3; j++) {
                System.out.print(i * j + "\t");
            }
            System.out.println();
        }
    }
}

Вывод:

1    2       3
2    4       6
3    6       9

Пример 6. Шаг больше 1 — моргание LED через раз

public class BlinkEven {
    public static void main(String[] args) {
        for (int pin = 2; pin <= 12; pin += 2) {
            System.out.println("Моргает LED на пине " + pin);
        }
    }
}

Вывод:

Моргает LED на пине 2
Моргает LED на пине 4
Моргает LED на пине 6
Моргает LED на пине 8
Моргает LED на пине 10
Моргает LED на пине 12

Подводные камни

  • Off-by-one. Граничные условия < и <= — частая причина багов: i <= n пройдёт n раз, i < n — n−1 раз (если i стартует с 1).

  • Бесконечный цикл. for (int i = 0; i < 10; i--) никогда не закончится; следите за знаком шага.

  • Изменение счётчика внутри тела. Менять переменную цикла в теле — плохая практика, делает поведение непредсказуемым.

  • for-each и индекс. В for-each нет доступа к индексу; если нужен индекс — используйте классический for.

  • Изменение коллекции внутри for-each. Удаление элементов из ArrayList внутри for-each вызовет ConcurrentModificationException.

См. также

Примечание

Лицензия и источники

Концепция описана на основе официального Java Tutorial от Oracle (https://docs.oracle.com/javase/tutorial/), Oracle Free Documentation License. Перевод, примеры и пояснения — © AlashEd Wiki.