Какой интерфейс в Java обеспечивает возможность обхода элементов коллекции (итерирования)?

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

Ответ

Базовый интерфейс — java.lang.Iterable<T>. Его реализация позволяет объекту быть целью for-each цикла.

Контракт интерфейса:

public interface Iterable<T> {
    Iterator<T> iterator(); // Должен возвращать итератор
    // default-методы forEach() и spliterator()...
}

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

  1. Коллекции (например, List, Set) реализуют Iterable<T>.
  2. Метод iterator() возвращает объект, реализующий интерфейс Iterator<T> с методами hasNext(), next() и remove().

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

List<String> names = List.of("Alice", "Bob", "Charlie");
Iterator<String> it = names.iterator();
while (it.hasNext()) {
    String name = it.next();
    System.out.println(name);
    // it.remove(); // Опциональное удаление элемента (поддерживается не всеми коллекциями)
}

Пример for-each (требует Iterable):

// Цикл for-each неявно вызывает iterator()
for (String name : names) {
    System.out.println(name);
}

Важно: Сам Iterable не является коллекцией. Это более общий контракт для любых объектов, которые можно обойти (например, DirectoryStream).