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

Какой интерфейс объединяет все коллекции?

1.0 Junior🔥 161 комментариев
#Коллекции#Основы Java

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

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

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

Интерфейс Iterable — объединитель всех коллекций

Основной интерфейс иерархии

Iterable<T> — это корневой интерфейс, который объединяет все коллекции в Java. Он находится в пакете java.lang и определяет возможность итерации по элементам.

public interface Iterable<T> {
    Iterator<T> iterator();
    default void forEach(Consumer<? super T> action) { ... }
    default Spliterator<T> spliterator() { ... }
}

Иерархия коллекций

Iterable<T>
    └── Collection<T>
        ├── List<T>
        │   ├── ArrayList<T>
        │   ├── LinkedList<T>
        │   └── Vector<T>
        ├── Set<T>
        │   ├── HashSet<T>
        │   ├── TreeSet<T>
        │   └── LinkedHashSet<T>
        └── Queue<T>
            ├── PriorityQueue<T>
            ├── Deque<T>
            │   ├── ArrayDeque<T>
            │   └── LinkedList<T>
            └── BlockingQueue<T>

Все коллекции прямо или косвенно наследуют Iterable.

Основной метод: iterator()

Этот метод возвращает Iterator<T> для перебора элементов:

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

while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

Способы итерации

1. Enhanced for loop (for-each)

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
for (Integer num : numbers) {  // Работает с любым Iterable
    System.out.println(num);
}

Этот синтаксис работает потому, что список реализует Iterable.

2. Iterator явно

Set<String> set = new HashSet<>(Arrays.asList("A", "B", "C"));
Iterator<String> iter = set.iterator();
while (iter.hasNext()) {
    String element = iter.next();
    System.out.println(element);
}

3. forEach() метод

List<String> list = Arrays.asList("X", "Y", "Z");
list.forEach(item -> System.out.println(item));

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

4. Streams API

List<Integer> nums = Arrays.asList(10, 20, 30);
nums.stream()
    .filter(n -> n > 15)
    .forEach(System.out::println);

Практическое применение

Создание своего Iterable класса

public class CustomCollection implements Iterable<String> {
    private List<String> items = new ArrayList<>();
    
    public void add(String item) {
        items.add(item);
    }
    
    @Override
    public Iterator<String> iterator() {
        return items.iterator();
    }
}

// Использование
CustomCollection collection = new CustomCollection();
collection.add("first");
collection.add("second");

for (String item : collection) {
    System.out.println(item);  // Работает благодаря Iterable
}

Работа с разными типами коллекций через Iterable

public static <T> void printAll(Iterable<T> iterable) {
    for (T element : iterable) {
        System.out.println(element);
    }
}

// Принимает List, Set, Queue и любую другую коллекцию
printAll(Arrays.asList(1, 2, 3));
printAll(new HashSet<>(Arrays.asList("A", "B")));
printAll(new LinkedList<>(Arrays.asList(true, false)));

Методы Iterator<T>

Iterator<String> iter = list.iterator();

// Проверка наличия следующего элемента
if (iter.hasNext()) {
    String element = iter.next();  // Получение элемента
}

// Удаление текущего элемента (только через Iterator!)
iter.remove();  // Безопасное удаление при итерации

Важные особенности

  1. Итератор изменяет коллекцию: если изменить коллекцию во время итерации напрямую, получишь ConcurrentModificationException:
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
for (Integer num : list) {
    if (num == 2) {
        list.remove(num);  // ❌ ConcurrentModificationException
    }
}

// ✅ Правильно:
Iterator<Integer> iter = list.iterator();
while (iter.hasNext()) {
    if (iter.next() == 2) {
        iter.remove();  // Безопасно
    }
}
  1. Не все коллекции поддерживают null: HashSet поддерживает, TreeSet нет.

  2. Производительность: ArrayList быстрее для индексного доступа, LinkedList эффективнее при частом удалении.

Заключение

Iterable — фундаментальный интерфейс, который делает все коллекции Java единообразными в использовании. Это позволяет писать универсальный код, работающий с любым типом коллекции.

Какой интерфейс объединяет все коллекции? | PrepBro