Интерфейс Collection

Collection<E> — корневой интерфейс иерархии коллекций в Java (пакет java.util). Он представляет группу элементов произвольного типа E и описывает общий контракт работы со всеми коллекциями: добавление, удаление, проверка наличия, обход, размер, преобразование в массив.

Сам Collection напрямую не реализуется. Вместо этого Java предоставляет производные интерфейсы (List, Set, Queue, Deque) и их конкретные классы (ArrayList, HashSet, LinkedList и др.). Это позволяет писать универсальный код, работающий с любой коллекцией через единый API.

Иерархия

Iterable<E>
    └── Collection<E>
            ├── List<E>      (ArrayList, LinkedList, Vector)
            ├── Set<E>       (HashSet, TreeSet, LinkedHashSet)
            └── Queue<E>     (LinkedList, PriorityQueue, ArrayDeque)

Основные методы

  • boolean add(E e) — добавить элемент

  • boolean remove(Object o) — удалить первое вхождение

  • boolean contains(Object o) — проверить наличие

  • int size() — количество элементов

  • boolean isEmpty() — пуста ли коллекция

  • void clear() — удалить все элементы

  • Iterator<E> iterator() — получить итератор

  • Object[] toArray() — преобразовать в массив

Пример 1. Базовые операции

import java.util.ArrayList;
import java.util.Collection;

public class CollectionBasics {
    public static void main(String[] args) {
        Collection<String> kits = new ArrayList<>();
        kits.add("Arduino UNO");
        kits.add("ESP32");
        kits.add("Robot Phobo");

        System.out.println("Размер: " + kits.size());
        System.out.println("Содержит ESP32? " + kits.contains("ESP32"));
        kits.remove("Arduino UNO");
        System.out.println("После удаления: " + kits);
    }
}

Output:

Размер: 3
Содержит ESP32? true
После удаления: [ESP32, Robot Phobo]

Пример 2. Обход коллекции

import java.util.ArrayList;
import java.util.Collection;

public class CollectionIterate {
    public static void main(String[] args) {
        Collection<Integer> pins = new ArrayList<>();
        pins.add(2);
        pins.add(4);
        pins.add(5);

        int sum = 0;
        for (Integer p : pins) {
            sum += p;
        }
        System.out.println("Сумма пинов: " + sum);
    }
}

Output:

Сумма пинов: 11

Пример 3. Массовые операции

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

public class CollectionBulk {
    public static void main(String[] args) {
        Collection<String> a = new ArrayList<>(Arrays.asList("D2", "D4", "D5"));
        Collection<String> b = new ArrayList<>(Arrays.asList("D5", "D6", "D8"));

        Collection<String> union = new ArrayList<>(a);
        union.addAll(b);
        System.out.println("Объединение: " + union);

        Collection<String> intersect = new ArrayList<>(a);
        intersect.retainAll(b);
        System.out.println("Пересечение: " + intersect);

        Collection<String> diff = new ArrayList<>(a);
        diff.removeAll(b);
        System.out.println("Разность: " + diff);
    }
}

Output:

Объединение: [D2, D4, D5, D5, D6, D8]
Пересечение: [D5]
Разность: [D2, D4]

Пример 4. Преобразование в массив

import java.util.ArrayList;
import java.util.Collection;

public class CollectionToArray {
    public static void main(String[] args) {
        Collection<String> sensors = new ArrayList<>();
        sensors.add("HC-SR04");
        sensors.add("DHT22");
        sensors.add("MPU6050");

        String[] arr = sensors.toArray(new String[0]);
        for (int i = 0; i < arr.length; i++) {
            System.out.println(i + ": " + arr[i]);
        }
    }
}

Output:

0: HC-SR04
1: DHT22
2: MPU6050

Пример 5. Stream API над Collection

import java.util.ArrayList;
import java.util.Collection;

public class CollectionStream {
    public static void main(String[] args) {
        Collection<Integer> values = new ArrayList<>();
        values.add(10);
        values.add(25);
        values.add(7);
        values.add(42);

        long big = values.stream().filter(v -> v > 10).count();
        int total = values.stream().mapToInt(Integer::intValue).sum();
        System.out.println("Больше 10: " + big);
        System.out.println("Сумма: " + total);
    }
}

Output:

Больше 10: 2
Сумма: 84

Подводные камни

  • Collection не гарантирует порядок — только List упорядочен по индексу.

  • add() может вернуть false (например, Set отвергает дубликаты).

  • Изменение коллекции во время итерации через for-each бросает ConcurrentModificationException. Используйте Iterator.remove().

  • Collection.toArray() без аргумента возвращает Object[], а не типизированный массив — передавайте new T[0].

  • equals() для Collection не имеет общего контракта — у List и Set разные правила сравнения.

См. также

Примечание

Материал подготовлен на основе официального руководства Oracle The Collections Framework и распространяется на условиях Oracle Free Documentation License. Тексты переписаны своими словами, примеры кода — оригинальные.