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

В чем разница между Collection и Collections?

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

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

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

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

Разница между Collection и Collections

Collection и Collections - это два разных класса в Java, которые часто путают из-за похожих имён. Collection - это интерфейс, а Collections - это утилита класс с полезными статическими методами для работы с коллекциями.

Collection - интерфейс

Collection - это интерфейс из пакета java.util, который определяет основные операции для работы с группами объектов. Это родительский интерфейс для всех коллекций.

public interface Collection<E> extends Iterable<E> {
    // Добавление элементов
    boolean add(E e);
    boolean addAll(Collection<? extends E> c);
    
    // Удаление элементов
    boolean remove(Object o);
    boolean removeAll(Collection<?> c);
    void clear();
    
    // Проверка наличия
    boolean contains(Object o);
    boolean containsAll(Collection<?> c);
    
    // Информация о коллекции
    int size();
    boolean isEmpty();
    
    // Преобразование
    Object[] toArray();
    <T> T[] toArray(T[] a);
    
    // Итерация
    Iterator<E> iterator();
}

Класс-наследники Collection:

  • List (ArrayList, LinkedList, Vector)
  • Set (HashSet, TreeSet, LinkedHashSet)
  • Queue (PriorityQueue, Deque)

Collections - утилита класс

Collections - это финальный класс из пакета java.util, который содержит только статические методы для работы с коллекциями. Это helper класс, который предоставляет удобные функции для сортировки, поиска, синхронизации и другие операции.

public class Collections {
    // Сортировка
    public static <T extends Comparable<? super T>> void sort(List<T> list);
    public static <T> void sort(List<T> list, Comparator<? super T> c);
    
    // Поиск
    public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key);
    public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c);
    
    // Синхронизация
    public static <T> Collection<T> synchronizedCollection(Collection<T> c);
    public static <T> List<T> synchronizedList(List<T> list);
    public static <K, V> Map<K, V> synchronizedMap(Map<K, V> m);
    
    // Неизменяемые коллекции
    public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c);
    public static <T> List<T> unmodifiableList(List<? extends T> list);
    public static <K, V> Map<K, V> unmodifiableMap(Map<? extends K, ? extends V> m);
    
    // Прочие методы
    public static <T> void fill(List<? super T> list, T obj);
    public static void shuffle(List<?> list);
    public static <T> void reverse(List<T> list);
    public static <T extends Comparable<? super T>> T min(Collection<? extends T> coll);
    public static <T extends Comparable<? super T>> T max(Collection<? extends T> coll);
}

Практические примеры

Работа с Collection интерфейсом:

// Collection - это интерфейс, переменная типа Collection
Collection<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);

numbers.remove(2);
boolean hasOne = numbers.contains(1);
int size = numbers.size();

// Итерация
for (Integer num : numbers) {
    System.out.println(num);
}

// Stream API
numbers.stream()
    .filter(n -> n > 1)
    .forEach(System.out::println);

Использование Collections утилиты для сортировки:

List<String> names = new ArrayList<>();
names.add("Charlie");
names.add("Alice");
names.add("Bob");

// Сортировка по умолчанию (алфавитный порядок)
Collections.sort(names);
// [Alice, Bob, Charlie]

// Сортировка в обратном порядке
Collections.sort(names, Collections.reverseOrder());
// [Charlie, Bob, Alice]

// Сортировка по пользовательскому критерию
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));

Collections.sort(people, (p1, p2) -> Integer.compare(p1.getAge(), p2.getAge()));

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

List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(3);
numbers.add(5);
numbers.add(7);
numbers.add(9);

int index = Collections.binarySearch(numbers, 5);
// index = 2 (позиция элемента 5)

int notFound = Collections.binarySearch(numbers, 4);
// notFound = -3 (отрицательное значение означает, что элемент не найден)

Синхронизированные коллекции:

// Создаём обычный список
List<String> list = new ArrayList<>();
list.add("Item1");
list.add("Item2");

// Оборачиваем в синхронизированный список для потокобезопасности
List<String> syncList = Collections.synchronizedList(list);

// Теперь список потокобезопасен при одновременном доступе из нескольких потоков
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.execute(() -> syncList.add("Item3"));
executor.execute(() -> syncList.add("Item4"));

Неизменяемые коллекции:

List<Integer> mutableList = new ArrayList<>();
mutableList.add(1);
mutableList.add(2);
mutableList.add(3);

// Создаём неизменяемую копию
List<Integer> immutableList = Collections.unmodifiableList(mutableList);

// Попытка изменить выбросит исключение
immutableList.add(4); // UnsupportedOperationException

// Неизменяемые коллекции из Collections
List<String> emptyList = Collections.emptyList();
Set<String> emptySet = Collections.emptySet();
Map<String, String> emptyMap = Collections.emptyMap();

// Singleton коллекции
List<Integer> singletonList = Collections.singletonList(42);
// Список содержит только один элемент

Другие полезные методы Collections:

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

// Найти минимальный элемент
Integer min = Collections.min(numbers); // 1

// Найти максимальный элемент
Integer max = Collections.max(numbers); // 5

// Заполнить список одним значением
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
Collections.fill(list, "x"); // [x, x, x]

// Перемешать список
Collections.shuffle(numbers);

// Развернуть список
Collections.reverse(numbers);

// Найти количество вхождений элемента
int count = Collections.frequency(numbers, 2);

Сравнительная таблица

CollectionCollections
ИнтерфейсКласс с статическими методами
Определяет методы для коллекцийПредоставляет утилиты для работы с коллекциями
add(), remove(), contains()sort(), binarySearch(), synchronizedList()
Реализуется ArrayList, HashSet и т.д.Работает со всеми типами коллекций
java.util.Collectionjava.util.Collections

Когда использовать

Collection используется когда:

  • Нужно работать с группой объектов
  • Нужно добавлять, удалять, проверять наличие элементов
  • Нужна абстракция над конкретным типом коллекции

Collections используется когда:

  • Нужно сортировать коллекцию
  • Нужно создать синхронизированную коллекцию
  • Нужно создать неизменяемую коллекцию
  • Нужна бинарный поиск
  • Нужны другие вспомогательные операции

Эти две концепции дополняют друг друга: Collection определяет интерфейс для работы с коллекциями, а Collections предоставляет удобные утилиты для различных операций над ними.