Что такое коллекции
Коллекции в Java — это фреймворк (набор классов и интерфейсов), который упрощает работу с группами объектов: их хранение, поиск, сортировку, удаление и т. д.
Вместо того чтобы самим писать массивы и методы для добавления/удаления элементов, Java предлагает готовые структуры данных.
Коллекции живут в пакете java.util и объединены в Java Collections Framework (JCF).
Где используются
- хранение данных (например, список пользователей или заказы в интернет-магазине);
- поиск и фильтрация (например, все заказы дороже 100 €);
- сортировка (по дате, алфавиту и т.д.);
- работа с уникальными данными (например, список логинов без повторов);
- сопоставление ключ–значение (карта настроек приложения или кэш).
Почему важно знать
- 90% задач в разработке связаны с хранением и обработкой данных.
- Коллекции экономят время — они уже оптимизированы и протестированы.
- Многие фреймворки (Spring, Hibernate) используют коллекции внутри себя
Основные интерфейсы коллекций
Всё крутится вокруг Collection и Map.
1) Интерфейс Collection
Подразделяется на:
- List — упорядоченные списки, допускают дубликаты.
- Реализации:
ArrayList,LinkedList,Vector,Stack.
- Реализации:
- Set — множества, уникальные элементы.
- Реализации:
HashSet,LinkedHashSet,TreeSet.
- Реализации:
- Queue/Deque — очереди (FIFO, LIFO).
- Реализации:
PriorityQueue,ArrayDeque.
- Реализации:
2) Интерфейс Map
Хранит пары ключ–значение.
- Реализации:
HashMap,LinkedHashMap,TreeMap,Hashtable,ConcurrentHashMap.
Иерархия Java Collections Framework
Iterable
│
Collection
┌───────────┼────────────────┐
│ │ │
List Set Queue/Deque
│ │ │
┌───┴───┐ ┌──┴─────────┐ ┌───┴─────────┐
ArrayList HashSet PriorityQueue
LinkedList LinkedHashSet ArrayDeque
Vector TreeSet
Stack
Map (НЕ наследуется от Collection)
┌─────────────┬───────────────┐
HashMap LinkedHashMap TreeMap
Hashtable ConcurrentHashMapОтличия коллекций
ArrayList— быстрый доступ по индексу, медленное удаление в середине.LinkedList— медленный доступ по индексу, быстрое добавление/удаление.HashSet— уникальные элементы, порядок не гарантируетсяLinkedHashSet— сохраняет порядок вставки.TreeSet— хранит элементы в отсортированном виде.HashMap— пары ключ–значение, порядок не гарантируется.LinkedHashMap— сохраняет порядок вставки.TreeMap— хранит ключи в отсортированном виде.
Связь с другими концепциями
- Generics: коллекции почти всегда используют обобщения (например,
List<String>). - Stream API: коллекции часто конвертируются в стримы для удобной обработки (
list.stream().filter(...).map(...).collect(...)). - Многопоточность: существуют конкурентные реализации (
ConcurrentHashMap,CopyOnWriteArrayList).---
Пример кода
Мы посмотрим на:
List→ArrayList,LinkedListSet→HashSet,TreeSetMap→HashMap,TreeMapИ поймём, чем они отличаются на практике.
import java.util.*;
public class CollectionsDemo {
public static void main(String[] args) {
// ====== LIST ======
List<String> arrayList = new ArrayList<>();
arrayList.add("Java");
arrayList.add("Python");
arrayList.add("C++");
arrayList.add("Java"); // допускает дубликаты
System.out.println("ArrayList: " + arrayList);
List<String> linkedList = new LinkedList<>();
linkedList.add("First");
linkedList.add("Second");
linkedList.add("Third");
System.out.println("LinkedList: " + linkedList);
// ====== SET ======
Set<String> hashSet = new HashSet<>();
hashSet.add("One");
hashSet.add("Two");
hashSet.add("Three");
hashSet.add("Two"); // дубликат игнорируется
System.out.println("HashSet: " + hashSet);
Set<String> treeSet = new TreeSet<>();
treeSet.add("Banana");
treeSet.add("Apple");
treeSet.add("Orange");
System.out.println("TreeSet (sorted): " + treeSet);
// ====== MAP ======
Map<Integer, String> hashMap = new HashMap<>();
hashMap.put(1, "One");
hashMap.put(2, "Two");
hashMap.put(3, "Three");
hashMap.put(2, "NewTwo"); // перезапишет значение для ключа 2
System.out.println("HashMap: " + hashMap);
Map<Integer, String> treeMap = new TreeMap<>();
treeMap.put(30, "Thirty");
treeMap.put(10, "Ten");
treeMap.put(20, "Twenty");
System.out.println("TreeMap (sorted by key): " + treeMap);
}
}ArrayList— хранит порядок, допускает дубликаты.
Вывод:[Java, Python, C++, Java].LinkedList— тоже список, но оптимизирован для вставок/удалений.HashSet— хранит только уникальные элементы, порядок непредсказуем.TreeSet— уникальные + сразу сортировка.HashMap— ключи уникальные, значения можно перезаписывать.TreeMap— ключи отсортированы автоматически.
Типичные ошибки
- Забывают про generics:
List list = new ArrayList(); // raw type, плохоЛучше так:
List<String> list = new ArrayList<>();- Используют не ту коллекцию:
ArrayListвместоHashSet, если нужны уникальные значения.LinkedListвместоArrayListпри большом количестве чтений по индексу.
- Сравнение через
==вместоequals()для объектов в коллекциях.
Best practices
- Используй интерфейс в объявлении (
List,Set,Map), а не конкретный класс:
List<String> list = new ArrayList<>();- Выбирай коллекцию по задаче:
- быстрый доступ по индексу →
ArrayList - уникальные элементы →
HashSet - сортировка →
TreeSet/TreeMap - ключ-значение →
HashMap
- быстрый доступ по индексу →
Шпаргалка по коллекциям
List (упорядоченные списки, допускают дубликаты)
| Класс | Особенности | Где использовать |
|---|---|---|
| ArrayList | Быстрый доступ по индексу O(1), медленное удаление/вставка в середине | Когда много чтения и редко меняется список |
| LinkedList | Быстрая вставка/удаление O(1) в начале/середине, медленный доступ по индексу | Когда нужно часто вставлять/удалять элементы |
| Vector / Stack | Старые синхронизированные реализации | Почти не используются, лучше ArrayDeque |
Set (множества, только уникальные элементы)
| Класс | Особенности | Где использовать |
|---|---|---|
| HashSet | Нет порядка, уникальные элементы, быстрый поиск O(1) | Когда нужны только уникальные значения |
| LinkedHashSet | Хранит порядок вставки | Когда нужны уникальные + порядок |
| TreeSet | Автоматическая сортировка | Когда нужны уникальные + сортировка |
Map (ключ–значение)
| Класс | Особенности | Где использовать |
|---|---|---|
| HashMap | Быстрый доступ O(1), порядок не гарантирован | Самый популярный вариант (кэш, настройки и т.д.) |
| LinkedHashMap | Хранит порядок вставки | Когда важен порядок ключей |
| TreeMap | Автоматическая сортировка по ключу | Когда нужен отсортированный словарь |
| ConcurrentHashMap | Потокобезопасный, без блокировок | Для многопоточности |
Queue / Deque (очереди и стеки)
| Класс | Особенности | Где использовать |
|---|---|---|
| ArrayDeque | Быстрее чем Stack и LinkedList | Для стека (LIFO) или очереди (FIFO) |
| PriorityQueue | Элементы сортируются по приоритету | Для очереди с приоритетом |
Советы
- Объявляй через интерфейс:
List<String> list = new ArrayList<>();- Для многопоточности используй
Concurrent-версии (ConcurrentHashMap,CopyOnWriteArrayList). - Для больших данных и фильтраций — удобно переходить в Stream API.