Что такое итератор (Iterator) в Java?

«Что такое итератор (Iterator) в Java?» — вопрос из категории Java Core, который задают на 22% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Итератор (Iterator) — это объект, реализующий паттерн «Итератор», который предоставляет стандартный способ последовательного обхода элементов коллекции без раскрытия её внутреннего устройства. Это один из фундаментальных интерфейсов Java Collections Framework.

Основные методы интерфейса Iterator<E>:

  • boolean hasNext() — возвращает true, если в коллекции остались не пройденные элементы.
  • E next() — возвращает следующий элемент коллекции и сдвигает позицию итератора. Выбрасывает NoSuchElementException, если элементов больше нет.
  • void remove()опциональная операция. Удаляет из коллекции последний элемент, возвращенный методом next(). Выбрасывает IllegalStateException, если next() не был вызван или remove() уже был вызван после последнего next().

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

List<String> fruits = Arrays.asList("Apple", "Banana", "Cherry");
Iterator<String> iterator = fruits.iterator();

while (iterator.hasNext()) {
    String fruit = iterator.next();
    System.out.println(fruit);
    // Безопасное удаление во время итерации
    if (fruit.equals("Banana")) {
        iterator.remove(); // Удалит "Banana" из исходного списка
    }
}

Преимущества использования итератора:

  • Универсальный доступ: Единый интерфейс для обхода любых коллекций (List, Set, Queue и их реализации).
  • Безопасное удаление: Это единственный корректный способ удаления элемента из коллекции во время её обхода (кроме специальных concurrent-коллекций). Использование цикла for и удаление через Collection.remove() приведет к ConcurrentModificationException.
  • Ленивая загрузка: Итераторы могут получать данные «на лету» (например, из базы данных или потока), не загружая все элементы в память сразу.

Связь с for-each: Цикл for-each (enhanced for loop) неявно использует итератор.

// Этот цикл...
for (String fruit : fruits) {
    System.out.println(fruit);
}
// ...эквивалентен этому коду с явным итератором.
Iterator<String> it = fruits.iterator();
while (it.hasNext()) {
    String fruit = it.next();
    System.out.println(fruit);
}