Какие условия необходимы для использования цикла for-each в Java?

«Какие условия необходимы для использования цикла for-each в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Цикл for-each (также known как enhanced for loop) требует выполнения одного условия:

Итерируемый объект должен реализовывать интерфейс java.lang.Iterable или быть массивом.

Синтаксис:

for (Type element : iterableOrArray) {
    // Действие с element
}

Примеры:

  1. С массивом (все массивы в Java совместимы с for-each):

    int[] numbers = {1, 2, 3};
    for (int num : numbers) {
        System.out.println(num);
    }
  2. С коллекцией (все стандартные коллекции реализуют Iterable):

    List<String> names = List.of("Alice", "Bob");
    for (String name : names) {
        System.out.println(name.toUpperCase());
    }

Важное ограничение:

  • Нельзя изменять коллекцию/массив (добавлять/удалять элементы) во время итерации с помощью for-each. Это вызовет ConcurrentModificationException.
  • Для модификации используйте явный Iterator и его методы (remove()).
    Iterator<String> it = list.iterator();
    while (it.hasNext()) {
        String item = it.next();
        if (shouldRemove(item)) {
            it.remove(); // Безопасное удаление
        }
    }

Почему это работает? Цикл for-each — это синтаксический сахар. Компилятор преобразует его в стандартный цикл с использованием Iterator для коллекций или индексного цикла для массивов.