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

В чем разница между Iterator и Iterable?

1.6 Junior🔥 211 комментариев
#Коллекции

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

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

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

В чем разница между Iterator и Iterable?

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

Iterable — контракт коллекции

Iterable — это интерфейс, который говорит: «Я могу предоставить вам Iterator для обхода моих элементов». Он содержит один метод:

public interface Iterable<T> {
    Iterator<T> iterator();
}

Iterable — это просто описание возможности, контракт коллекции. Каждый раз, когда вы вызываете iterator(), получаете новый Iterator.

List<String> list = Arrays.asList("Java", "Python", "C++");
Iterator<String> iter1 = list.iterator();
Iterator<String> iter2 = list.iterator(); // Разные объекты!

Iterator — процесс итерации

Iterator — это интерфейс, который описывает сам процесс обхода:

public interface Iterator<E> {
    boolean hasNext();   // Есть ли еще элементы?
    E next();            // Получить следующий элемент
    void remove();       // Удалить текущий элемент
}

Iterator — это конкретный, stateful объект, который помнит свою позицию в коллекции.

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

Практические различия

1. Множественные итерации

Iterable позволяет создавать несколько независимых Iterator'ов:

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

Iterator<String> it1 = names.iterator();
Iterator<String> it2 = names.iterator();

System.out.println(it1.next()); // Alice
System.out.println(it1.next()); // Bob

System.out.println(it2.next()); // Alice (независимый iterator)

2. Enhanced For Loop

Синтаксис for-each работает ТОЛЬКО с Iterable:

for (String name : names) {  // Это работает
    System.out.println(name);
}

// Под капотом это преобразуется в:
for (Iterator<String> it = names.iterator(); it.hasNext();) {
    String name = it.next();
    System.out.println(name);
}

3. Состояние

Iterator имеет состояние (текущую позицию), Iterable — нет:

Iterator<Integer> it = Arrays.asList(1, 2, 3).iterator();
it.next(); // Позиция: 0→1
it.next(); // Позиция: 1→2
// Iterator помнит, где он находится

4. Удаление во время итерации

Только Iterator позволяет безопасно удалять элементы:

Iterator<String> it = list.iterator();
while (it.hasNext()) {
    String s = it.next();
    if (s.equals("delete")) {
        it.remove(); // Безопасно!
    }
}

// for-each это не позволяет
for (String s : list) {
    list.remove(s); // ConcurrentModificationException!
}

Аналогия

  • Iterable = книга (может дать вам читателя)
  • Iterator = конкретный процесс чтения (вы помните, на какой странице)

Заключение

  • Iterable — это интерфейс коллекции, говорящий "я итерируемая"
  • Iterator — это конкретный процесс обхода с состоянием
  • Одна Iterable может создать много Iterator'ов
  • Iterator нужен для безопасного удаления и контроля процесса обхода