Гид по технологиям

Циклы в Java: for, while и do while

4 min read Java Обновлено 28 Dec 2025
Циклы в Java: for, while и do while
Циклы в Java: for, while и do while

Программист за ноутбуком, набирает код на Java

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

Коротко о терминах

  • Цикл: повторение блока кода.
  • Счётчик: переменная, управляющая количеством итераций.
  • Вложенный цикл: цикл внутри другого цикла.

1. For — счётчик в заголовке

For — это цикл с управлением по счётчику. Он обычно содержит инициализацию счётчика, условие продолжения и обновление счётчика прямо в заголовке.

Синтаксис:

for (initialization; condition; increment) {
    // statements
}

Все три выражения внутри заголовка могут быть опущены, но точки с запятой ; обязательны. Если опустить условие, for превратится в бесконечный цикл (условие интерпретируется как true).

Примеры:

int x = 4;
for (; x < 10; x++) {
    System.out.println(x);
}

Можно объявлять счётчик в заголовке:

for (int i = 0; i < 5; i++) {
    System.out.println(i);
}
// i здесь недоступна — область видимости локальна для цикла

Если счётчик объявлен вне цикла, он доступен после цикла:

int i = 0;
for (; i < 3; i++) {
    // ...
}
System.out.println(i); // доступно

Вложенные циклы:

for (int x = 2; x < 9; x = x + 2) {
    for (int y = 5; y >= 3; y--) {
        System.out.println(x * y);
    }
}

Советы:

  • Избегайте более трёх вложенных циклов — читаемость падает.
  • Инкремент не обязательно +1 — это может быть x = x + 2, x += 3 или x--.
  • При обратном счёте внимательно выставляйте начальное значение и условие продолжения.

2. While — условный цикл

While проверяет условие перед выполнением тела. Он подходит, когда количество итераций заранее неизвестно.

Синтаксис:

while (condition) {
    // statements
}

Когда нужно заменить for:

initialization;
while (condition) {
    // statements
    increment;
}

Важно: если в теле цикла нет операции, которая в какой-то момент сделает условие ложным, цикл станет бесконечным.

3. Do while — выполняется минимум один раз

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

Синтаксис:

do {
    // statements to execute
} while (condition);

Если условие ложно с самого начала, тело всё равно выполнится один раз.

Циклы и массивы

При итерации по массивам частая ошибка — off-by-one (на одну позицию в массиве больше/меньше). В Java длина массива доступна через array.length.

Правильный шаблон для прохода по массиву:

for (int i = 0; i < array.length; i++) {
    // доступ к array[i]
}

Альтернативы и советы:

  • Используйте i < array.length, а не i <= array.length - 1 — так меньше шансов ошибиться.
  • Для чтения элементов применяйте расширенный for (for-each):
for (Type item : array) {
    // обрабатываем item
}

Типичные ошибки и когда циклы «ломаются”

Важно:

  • Off-by-one: неверное условие (<= вместо < или наоборот).
  • Бесконечный цикл: забыли инкремент/деинкремент или условие никогда не меняется.
  • Неправильная область видимости счётчика: попытка использовать локальную переменную вне цикла.
  • Модификация коллекции при итерации: ConcurrentModificationException при изменении списка во время итерации через for-each.

Контрпример: если вы удаляете элементы из ArrayList внутри for-each, используйте явный итератор:

Iterator it = list.iterator();
while (it.hasNext()) {
    Type t = it.next();
    if (условие) it.remove();
}

Как выбрать тип цикла — мини-методология

  1. Известно ли точное количество итераций?
    • Да → for (явный счётчик).
    • Нет → while или do while.
  2. Нужно ли гарантированно выполнить тело хотя бы раз?
    • Да → do while.
  3. Итерация по коллекции/массиву без индекса → for-each.
  4. Требуется доступ к индексам → обычный for.

Ментальная модель: for — «перебор с указателем», while — «повторять пока условие верно», do while — «сделай сначала, потом проверь».

Факто-бокс: ключевые числа и шаблоны

  • Рекомендация по вложенности: не более 3-х уровней.
  • Стандартные шаблоны: for (i=0; i
  • Ошибки: off-by-one и бесконечные циклы — самые частые логические баги.

Чек-лист для ролей

Для разработчика:

  • Выбран правильный тип цикла.
  • Проверено условие выхода (нет бесконечных ветвей).
  • Индексы в пределах [0, length-1].

Для код-ревьюера:

  • Нет модификации коллекции в for-each.
  • Область видимости счётчиков понятна.
  • Сложность вложенности приемлема.

Тест-кейсы и критерии приёмки

  1. Пустой массив/список → цикл не выполняется (или выполняется ровно один раз для do while в зависимости от логики).
  2. Одна итерация → ожидаемое поведение и завершающее условие.
  3. Граничные индексы: проверка i=0 и i=array.length-1.
  4. Модификация коллекции → покрыть тестом удаление/добавление элементов во время итерации.

Критерии приёмки:

  • Цикл завершает работу в ожидаемом количестве итераций.
  • Нет утечек памяти, блокировок или бесконечных циклов.
  • Логические границы соблюдены (нет off-by-one).

Галерея крайних случаев

  • Очень большие циклы: подумайте о производительности и возможности прерывания.
  • Цикл с блокирующими операциями I/O — используйте таймауты или асинхронность.
  • Одновременная модификация коллекций в многопоточной среде — используйте потокобезопасные коллекции или синхронизацию.

Короткая сводка и рекомендации

  • Используйте for, когда нужен индекс или известное количество итераций.
  • Используйте while, когда условие контролирует цикл извне.
  • Используйте do while, если тело должно выполниться хотя бы один раз.
  • Предпочитайте for-each для простого чтения коллекций.

Важно: всегда тестируйте граничные условия и сценарии с пустыми коллекциями.

Однострочный глоссарий

  • for-each: расширенный for для перебора коллекций.
  • off-by-one: ошибка на один индекс.
  • бесконечный цикл: цикл без условия выхода.

Заключение

Циклы — базовый инструмент программирования. Понимание разницы между for, while и do while, осознанный выбор структуры и проверка граничных случаев помогут писать корректный и читаемый код. Следуйте чек-листам и покрывайте тестами граничные сценарии.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Фишинг через подложенные URL на Facebook — защита
Кибербезопасность

Фишинг через подложенные URL на Facebook — защита

Как создать песню в Suno AI — пошагово
Музыка

Как создать песню в Suno AI — пошагово

Планирование путешествия в Notion — шаблон и чек‑листы
Путешествия

Планирование путешествия в Notion — шаблон и чек‑листы

Уютный рабочий стол: идеи и практические шаги
Рабочее место

Уютный рабочий стол: идеи и практические шаги

Как откатить iOS на iPhone — пошагово
Руководство

Как откатить iOS на iPhone — пошагово

Выбор кастомных колпачков для механической клавиатуры
Периферия

Выбор кастомных колпачков для механической клавиатуры