JavaRush/Java блог/Java Developer/Цикл for-each в Java
Автор
Артем Divertitto
Senior Android-разработчик в United Tech

Цикл for-each в Java

Статья из группы Java Developer
участников

Кратко

  • for-each это сокращенная форма цикла for для перебора всех элементов подряд: for (Тип переменная : источник).
  • Слова foreach в Java нет: ключевое слово тут обычный for, а роль разделителя играет двоеточие.
  • Работает с массивами и с любым объектом, класс которого реализует java.lang.Iterable, то есть со всеми стандартными коллекциями.
  • Индекса у него нет: переменная на каждом шаге получает сам элемент, а не его номер.
  • Поэтому через for-each не пройти список с конца, не заменить элементы массива, не узнать позицию найденного элемента и не удалить элемент коллекции по ходу обхода.
  • Когда индекс не нужен, брать стоит именно for-each: он короче, и в нем нельзя ошибиться с границами.

Что такое foreach в Java?

For-each это разновидность цикла for, которая используется, когда нужно обработать все элементы массива или коллекции. “For each” с английского так и переводится: “для каждого”. Собственно, само словосочетание foreach в этом цикле не используется. Его синтаксис следующий:
for (type itVar : array)
{
    Блок операторов;
}
Здесь type это тип итерационной переменной (совпадает с типом данных в массиве!), itVar ее имя, array сам массив (тут также может быть другая структура данных, какая-нибудь коллекция, например, ArrayList), то есть объект, по которому выполняется цикл. Как вы видите, счетчик в такой конструкции не применяется, итерационная переменная перебирает элементы массива или коллекции, а не значения индекса. При выполнении такого цикла, итерационной переменной последовательно присваивается значение каждого элемента массива или коллекции, после чего выполняется указанный блок операторов (или оператор).

Помимо цикла for-each в Java также есть метод forEach(). О нем можно почитать, например, в статье “Хватит писать циклы! Топ-10 лучших методов для работы с коллекциями в Java 8”

Внимание: цикл for-each можно применить к массивам и любым классам, которые реализуют интерфейс java.lang.Iterable. Эквивалентом коду выше будет следующий цикл for:
for (int i=0; i<array.length; i++)
{

    Блок операторов;
}

Пример использования Java foreach

Создадим массив из оценок ученика. Затем с помощью for-each распечатаем все оценки, выведем среднюю оценку и найдем максимальную из них.
public class ForEachTest {

//метод, который распечатывает все оценки
public static void printAllGrades(int[] grades) {
        System.out.print("|");
        for (int num : grades) {

            System.out.print(num + "|");
        }
        System.out.println();
    }

//метод, в котором выводится средняя оценка

public static double midGrade(int[] numbers) {
        int grade = 0;

        for (int num : numbers) {
            grade = num + grade;
        }
        return ((double) grade / numbers.length);

    }
//метод в котором вычисляется лучшая (максимальная) оценка
    public static int bestGrade(int[] numbers) {
        int maxGrade = numbers[0];

        for (int num : numbers) {
            if (num > maxGrade) {
                maxGrade = num;
            }
        }
        return maxGrade;
    }

public static void main(String[] args) {

//массив оценок
int[] grades = {5, 10, 7, 8, 9, 9, 10, 12};


  int highest_marks = bestGrade(grades);
        System.out.print("All the grades: ");
        printAllGrades(grades);
        System.out.println("The highest grade is " + highest_marks);
        System.out.println("The average grade is " + midGrade(grades));
    }

}
Вывод программы:
All the grades: |5|10|7|8|9|9|10|12|
The highest grade is 12
The average grade is 8.75
А теперь давайте посмотрим, как бы выглядел метод распечатывания всех оценок, выполненный с помощью обычного цикла for:
public static void printAllGrades(int[] grades) {
        System.out.print("|");
        for (int i = 0; i < grades.length; i++) {

            System.out.print(grades[i] + "|");
        }
        System.out.println();
    }
Если вызвать этот метод из метода main, мы получим результат:
All the grades: |5|10|7|8|9|9|10|12|

Пример использования цикла for-each с коллекциями

Создадим коллекцию из имен и выведем все имена на экран.
List<String> names = new ArrayList<>();
        names.add("Snoopy");
        names.add("Charlie");
        names.add("Linus");
        names.add("Shroeder");
        names.add("Woodstock");

        for(String name : names){
            System.out.println(name);
        }
С Java 10 тип итерационной переменной можно не указывать явно: for (var name : names). Компилятор выведет его сам, на поведение цикла это никак не влияет.

Ограничения цикла for-each

Компактная форма for-each считается более читаемой, чем for, и правилом хорошего тона считается использовать именно for-each там, где это можно сделать. Однако for-each это менее универсальная конструкция, чем обычный for. Приведем несколько простых случаев, где воспользоваться for-each не получится вовсе или получится, но с трудом.
  1. Если вы хотите пройти по циклу с конца в начало. То есть прямого for-each аналога следующему коду нет:

    for (int i = array.length - 1; i >= 0; i--)
    {
          System.out.println(array[i]);
    }
  2. For-each не подходит, если вы хотите внести изменения в массив. Например, не получится организовать сортировку массива, не меняя его элементы местами. Или вот, в следующем коде изменится не элемент массива, а только итерационная переменная:

    for (int itVar : array)
    {
        itVar++;
    }
  3. Если вы ищете элемент в массиве и вам нужно вернуть (или передать дальше) индекс искомого элемента, лучше воспользоваться обычным циклом for.

for-each и обычный for: что выбрать

Соберем все различия в одну таблицу, чтобы было видно, когда какой цикл брать.
Задачаfor-eachобычный for
Узнать индекс элементанельзя, переменная хранит сам элементможно, индекс это и есть счетчик
Пройти с конца в началонельзяможно
Заменить элементы массиванельзя, меняется только итерационная переменнаяможно, через array[i] = ...
Удалить элемент коллекции по ходу обходанельзя, вылетит ConcurrentModificationExceptionможно, но придется следить за сдвигом индексов
По чему можно пройтимассивы и все, что реализует Iterableвсе, к чему есть доступ по индексу или счетчику
Объем кодакороче, границы задавать не нужнодлиннее, зато полный контроль

Вопросы и ответы

Чем for-each отличается от обычного цикла for?

В for-each нет счетчика и индекса: переменная на каждом шаге получает сам элемент. Обычный for работает с номером позиции, поэтому умеет идти с конца, менять элементы массива и возвращать индекс найденного элемента.

По чему можно пройти циклом for-each?

По массиву любого типа и по любому объекту, класс которого реализует интерфейс java.lang.Iterable. Под это условие подходят все стандартные коллекции: ArrayList, LinkedList, HashSet и остальные.

Почему в for-each нельзя изменить элементы массива?

Итерационная переменная это копия значения элемента или копия ссылки на него, а не сам элемент. Присваивание внутри цикла меняет только переменную, массив остается прежним. Чтобы записать новое значение, нужен индекс, то есть обычный for.

Можно ли удалять элементы коллекции внутри for-each?

Нет. При первой же попытке удалить что-то из коллекции прямо в цикле вылетит ConcurrentModificationException. Удалять нужно либо через явный Iterator и его метод remove(), либо методом removeIf().

Как пройти циклом for-each по Map?

Напрямую нельзя: Map не реализует Iterable. Перебирают либо ключи через keySet(), либо значения через values(), либо пары целиком через entrySet(), и тогда переменная цикла будет типа Map.Entry.

Можно ли в for-each не писать тип переменной?

Да, начиная с Java 10 вместо типа пишут var, и компилятор выведет тип сам: for (var num : grades). На поведение цикла это не влияет, это только сокращение записи.

Полезное видео о for-each, подготовленное учеником JavaRush

Циклы в курсе JavaRush

На JavaRush к использованию циклов на практике приступают на 4 уровне квеста Java Syntax. Там им посвящено несколько лекций, а также множество задач разного уровня для закрепления навыков работы с ними. Вообще, никуда вы от них не денетесь, циклы это одна из важнейших конструкций в программировании.

Подробнее о for-each и циклах:

  1. For и For-Each Loop: сказ о том, как я итерировался, итерировался, да не выитерировался, хорошая подробная статья о циклах for и for-each в Java. Рассчитана на подготовленного читателя (примерно от 10 уровня JavaRush и выше).
  2. Оператор While. Статья посвящена самому простому циклу while, с которого начинается знакомство с циклами на JavaRush.
  3. Хватит писать циклы! Топ-10 лучших методов для работы с коллекциями в Java 8. Из этой статьи студент JavaRush, который уже прошел половину курса или больше, узнает много интересного о работе с коллекциями.
  4. Коллекции в Java: Java Collections Framework. Обзор коллекций, по которым чаще всего и ходит for-each: списки, множества, очереди и Map.
Источник: Oracle Java Tutorials: The for Statement.
Комментарии (68)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Grigoryvvv
Уровень 28
Expert
28 февраля, 23:59
01.03.2026 / 14 уровень
Anonymous #3235765
Уровень 21
12 декабря 2025, 19:22
В видео у автора не удалились элементы которые начинаются на "В" в цикле while
Daniil K
Уровень 2
30 июня 2025, 19:21
Не понятно, можно ли с помощью цикла foreach проинициализировать пустой(без значений) массив? С помощью ообычного for это делается легко, а вот с foreach...
Закирка Джава МОНСТРШколяр в Школа
2 сентября 2025, 15:35
Ответ простой: используйте коллекции. Ну а так, я думаю, лучше использовать обычный массив или forEach по копии пустого массива.
АлександраРаботает в Schlumberger
12 апреля 2024, 18:58
Узнала автора видео по голосу. Смотрела его видосики, когда только начинала знакомство с Java.😁
JavaRusher853
Уровень 36
15 февраля 2024, 20:00
А где же приветствие в начале статьи? Этот автор сломал систему))
Максим Li Backend Developer
4 декабря 2023, 04:32
Отличный контент!
Andrei Karavai
Уровень 30
15 ноября 2023, 15:02
В видео есть попытка удалить часть значений в ArrayList при помощи итератора, и она не успешная, на экран были выведены всё ещё все старые элементы. Попробую сам такую штуку с итератором провернуть. Пологаю, что там тоже есть какие-то ограничения на удаление.
Andrei Karavai
Уровень 30
15 ноября 2023, 19:24
Попробовал удалить из хеш-сета через "итератор" (не через for each) и у меня сработало, норм удалилось :
Iterator<String> iterator = test.iterator();

        while (iterator.hasNext()) {
            if (iterator.next().charAt(1) == '1') {
                iterator.remove();
            }
        }
        System.out.println(test);
ElenaN
Уровень 37
17 октября 2023, 14:16
Однозначно советую посмотреть видео в конце, но сразу ставьте на скорость 1.5, даже не пытайтесь смотреть с оригинальной скоростью))
Максим Li Backend Developer
4 декабря 2023, 04:32
Скорость 1.5 помогла, ))). а сам материал полезный!
Alexander Rozenberg
Уровень 2
18 июля 2023, 14:17
fine
No Name
Уровень 22
11 июня 2023, 02:30
+ статья в копилку