В чем разница между Collection и Collections?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между 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);
Сравнительная таблица
| Collection | Collections |
|---|---|
| Интерфейс | Класс с статическими методами |
| Определяет методы для коллекций | Предоставляет утилиты для работы с коллекциями |
| add(), remove(), contains() | sort(), binarySearch(), synchronizedList() |
| Реализуется ArrayList, HashSet и т.д. | Работает со всеми типами коллекций |
| java.util.Collection | java.util.Collections |
Когда использовать
Collection используется когда:
- Нужно работать с группой объектов
- Нужно добавлять, удалять, проверять наличие элементов
- Нужна абстракция над конкретным типом коллекции
Collections используется когда:
- Нужно сортировать коллекцию
- Нужно создать синхронизированную коллекцию
- Нужно создать неизменяемую коллекцию
- Нужна бинарный поиск
- Нужны другие вспомогательные операции
Эти две концепции дополняют друг друга: Collection определяет интерфейс для работы с коллекциями, а Collections предоставляет удобные утилиты для различных операций над ними.