← Назад к вопросам

Что значит перебор элементов по очереди?

2.0 Middle🔥 241 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Перебор элементов по очереди: Итерация в Java

Перебор элементов по очереди (итерация или iteration) — это процесс последовательного доступа к каждому элементу коллекции (массива, списка, множества и т.д.) один за другим. Это базовая и самая часто используемая операция при работе с данными в Java.

Что это означает?

Представьте очередь людей в магазине:

  1. Первый человек обслуживается
  2. Потом второй
  3. Потом третий
  4. И так далее до конца очереди

Так же и в программировании — мы берём элемент, обрабатываем его, потом берём следующий, и так до конца коллекции.

Способы перебора в Java

1. Цикл for (традиционный)

int[] numbers = {10, 20, 30, 40, 50};

// Проход по массиву с индексом
for (int i = 0; i < numbers.length; i++) {
    System.out.println(numbers[i]);
}

// Вывод:
// 10
// 20
// 30
// 40
// 50

Как работает:

  • i = 0 — начинаем с первого элемента
  • i < numbers.length — пока индекс меньше длины массива
  • i++ — переходим к следующему элементу

2. For-each цикл (улучшенный for)

Это самый простой и безопасный способ:

List<String> names = Arrays.asList(\"Alice\", \"Bob\", \"Charlie\");

// Перебор по коллекции без индекса
for (String name : names) {
    System.out.println(name);
}

// Вывод:
// Alice
// Bob
// Charlie

Преимущества:

  • Нет IndexOutOfBoundsException
  • Более читаемый код
  • Работает с любыми коллекциями

3. Iterator (итератор)

Мощный инструмент для контролируемого перебора:

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
Iterator<Integer> iterator = list.iterator();

while (iterator.hasNext()) {
    Integer value = iterator.next();
    System.out.println(value);
    
    // Можно безопасно удалять элементы
    if (value == 3) {
        iterator.remove();
    }
}

// Вывод:
// 1
// 2
// 3
// 4
// 5

Когда использовать: Когда нужно удалять элементы во время итерации.

4. Метод forEach() (функциональный подход)

Модернизированный способ с Java 8+:

List<String> fruits = Arrays.asList(\"Apple\", \"Banana\", \"Orange\");

// С lambda выражением
fruits.forEach(fruit -> System.out.println(fruit));

// Или с method reference
fruits.forEach(System.out::println);

// Вывод:
// Apple
// Banana
// Orange

5. Stream API (функциональный стиль, Java 8+)

Мощный и гибкий способ:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// Простой перебор
numbers.stream()
       .forEach(System.out::println);

// С фильтрацией
numbers.stream()
       .filter(n -> n > 2)
       .forEach(System.out::println);

// Вывод (с фильтром):
// 3
// 4
// 5

6. While цикл

List<String> items = new ArrayList<>(Arrays.asList(\"X\", \"Y\", \"Z\"));
int index = 0;

while (index < items.size()) {
    System.out.println(items.get(index));
    index++;
}

Сравнение способов

СпособПростотаГибкостьКогда использовать
for с индексомСредняяВысокаяКогда нужен индекс
for-eachВысокаяНизкаяОбычный перебор
IteratorСредняяВысокаяУдаление во время перебора
forEach()ВысокаяНизкаяФункциональный стиль
Stream APIСредняяОчень высокаяСложные операции
whileСредняяВысокаяСпециальные условия

Практический пример: Обработка коллекции

public class OrderProcessing {
    public static void main(String[] args) {
        List<Order> orders = new ArrayList<>();
        orders.add(new Order(1, \"Laptop\", 1000));
        orders.add(new Order(2, \"Mouse\", 25));
        orders.add(new Order(3, \"Monitor\", 300));
        
        // Перебор с обработкой
        double totalPrice = 0;
        for (Order order : orders) {
            totalPrice += order.getPrice();
            System.out.println(\"Обработан заказ: \" + order.getName());
        }
        
        System.out.println(\"Общая стоимость: \" + totalPrice);
    }
}

Важные замечания

  1. ConcurrentModificationException — не удаляйте элементы в for-each
// ❌ Плохо: ConcurrentModificationException
for (String item : list) {
    if (item.equals(\"bad\")) {
        list.remove(item); // ОШИБКА!
    }
}

// ✓ Хорошо: используйте Iterator
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    if (it.next().equals(\"bad\")) {
        it.remove(); // OK
    }
}
  1. Производительность — различные способы могут отличаться по скорости
  2. Null элементы — будьте осторожны с null при итерации

Итоговая рекомендация

  • Используйте for-each как стандартный подход — он простой и безопасный
  • Используйте Iterator, если нужно удалять элементы
  • Используйте Stream API, если нужны сложные трансформации
  • Используйте for с индексом, если нужен индекс элемента

Перебор элементов по очереди — это фундаментальный навык, без которого невозможно работать с коллекциями в Java. Выбирайте способ в зависимости от задачи.