1. Что такое интерфейс Collection
В Java интерфейс — это как договор: если класс реализует интерфейс, он обязан предоставить реализацию всех его методов. Интерфейс сам по себе не хранит состояние и не содержит кода (почти: начиная с Java 8 возможны default-методы, но сейчас важна базовая идея).
Collection — базовый интерфейс для большинства коллекций в Java. Он определяет, что коллекция умеет делать: добавлять элементы, удалять, узнавать размер, проверять наличие элементов и т. п.
public interface Collection<E> extends Iterable<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
boolean add(E e);
boolean remove(Object o);
void clear();
Iterator<E> iterator();
// ... и ещё куча полезных методов
}
Ключевые методы:
- add(E e) — добавить элемент.
- remove(Object o) — удалить элемент.
- size() — узнать количество элементов.
- isEmpty() — проверить, пустая ли коллекция.
- contains(Object o) — проверить наличие элемента.
- clear() — очистить коллекцию.
- iterator() — получить итератор для перебора.
Почему Map не наследует Collection?
Map стоит особняком среди коллекций. Потому что Map — это набор пар «ключ → значение», а не просто набор элементов. У него другой контракт и другой набор методов. Например, в Map нет метода add, потому что добавление делается через put(key, value), и нет смысла проверять наличие значения, не зная ключа.
2. Иерархия коллекций
Мысленное «дерево» основных интерфейсов выглядит так:
Iterable
|
Collection
/ | \
List Set Queue
|
Deque
- Iterable — самый базовый интерфейс: всё, что можно перебирать в цикле for-each.
- Collection — расширяет Iterable, добавляет операции работы с коллекцией элементов.
- Три главные ветки:
- List — упорядоченный список, допускает дубликаты.
- Set — множество уникальных элементов, порядок зависит от реализации.
- Queue — очередь (обычно FIFO); подвид — Deque (двусторонняя очередь).
А вот Map живёт отдельно:
Map
/ \
HashMap TreeMap
Визуализация иерархии (схема)
+--------------------+
| Iterable<E> |
+--------------------+
|
+--------------------+
| Collection<E> |
+--------------------+
/ | \
+--------+ +-------+ +-------+
| List | | Set | | Queue |
+--------+ +-------+ +-------+
|
+------+
|Deque |
+------+
+--------------------+
| Map<K,V> |
+--------------------+
3. List: упорядоченная коллекция с дубликатами
List — это коллекция, где:
- Важен порядок элементов (первый, второй, третий…).
- Допускаются одинаковые элементы (дубликаты).
- Можно получить элемент по индексу (list.get(2)), заменить, вставить в любое место.
Примеры реализаций: ArrayList — быстрый доступ по индексу; LinkedList — хорош при частых вставках/удалениях в середине.
import java.util.*;
List<String> shoppingList = new ArrayList<>();
shoppingList.add("Молоко");
shoppingList.add("Хлеб");
shoppingList.add("Сыр");
shoppingList.add("Хлеб"); // Дубликаты разрешены!
System.out.println(shoppingList.get(1)); // "Хлеб"
Типичные методы List:
- add(E e), add(int index, E e)
- get(int index), set(int index, E e)
- remove(int index), remove(Object o)
- indexOf(Object o), lastIndexOf(Object o)
4. Set: множество уникальных элементов
Set — это коллекция, где:
- Каждый элемент уникален (никаких дубликатов).
- Порядок хранения не гарантируется у HashSet, может быть сортировка у TreeSet или порядок вставки у LinkedHashSet.
Примеры реализаций: HashSet, TreeSet, LinkedHashSet.
import java.util.*;
Set<String> uniqueNames = new HashSet<>();
uniqueNames.add("Аня");
uniqueNames.add("Борис");
uniqueNames.add("Аня"); // Не добавится — уже есть!
System.out.println(uniqueNames.contains("Аня")); // true
System.out.println(uniqueNames.size()); // 2
Типичные методы Set:
- add(E e), remove(Object o)
- contains(Object o)
- size(), isEmpty()
5. Map: коллекция пар ключ-значение
Map — это коллекция, где:
- Каждый элемент — пара ключ → значение.
- Ключи уникальны, значения могут повторяться.
- Быстрый доступ по ключу.
Примеры реализаций: HashMap, TreeMap, LinkedHashMap.
import java.util.*;
Map<String, String> phoneBook = new HashMap<>();
phoneBook.put("Аня", "+19991112233");
phoneBook.put("Борис", "+19994445566");
phoneBook.put("Аня", "+19990001122"); // Перезапишет номер Ани!
System.out.println(phoneBook.get("Аня")); // "+19990001122"
System.out.println(phoneBook.containsKey("Борис")); // true
Типичные методы Map:
- put(K key, V value), get(K key)
- remove(K key)
- containsKey(K key), containsValue(V value)
- keySet(), values(), entrySet()
6. Визуализация иерархии: всё на одной картинке
Небольшая сводная таблица:
| Интерфейс | Описание | Примеры реализаций | Ключевые особенности |
|---|---|---|---|
|
Упорядоченный список | |
Доступ по индексу, дубликаты |
|
Множество уникальных значений | |
Только уникальные элементы |
|
Пары ключ-значение | |
Ключи уникальны, значения любые |
Иерархия на схеме:
Collection
/ | \
List Set Queue
|
Deque
Map (отдельно)
7. Когда использовать какой интерфейс
List
- Когда важен порядок элементов (например, история действий пользователя).
- Когда нужны дубликаты (например, позиции заказа).
- Когда нужен быстрый доступ/замена по индексу.
Set
- Когда нужна уникальность (email, логины, id).
- Когда не важен порядок, или наоборот — нужен автоматически отсортированный набор (TreeSet).
Map
- Когда нужно сопоставлять ключи и значения (id → объект, логин → профиль).
- Когда нужен быстрый поиск по ключу.
- Когда ключи должны быть уникальны, а значения — нет.
8. Типичные ошибки при работе с иерархией коллекций
Ошибка № 1: Использование неправильного интерфейса в объявлении переменной. Если вы пишете ArrayList<String> list = new ArrayList<>();, вы жёстко привязываетесь к реализации. Предпочтительнее List<String> list = new ArrayList<>(); — так проще заменить реализацию.
Ошибка № 2: Попытка добавить дубликаты в Set и ожидание, что они появятся. Это не баг, а особенность: Set по определению не хранит дубликаты. Повторная вставка игнорируется.
Ошибка № 3: Использование Map как обычной коллекции. Map — это не список и не множество. Для перебора используйте keySet(), values() или entrySet().
Ошибка № 4: Ожидание порядка в HashSet или HashMap. HashSet и HashMap не гарантируют порядок. Если он важен — берите LinkedHashSet или LinkedHashMap.
Ошибка № 5: Использование List для уникальных элементов. Если нужна уникальность — используйте Set. List не предотвращает дубликаты.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ