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 інший контракт і власний набір методів. Наприклад, у 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
- Коли потрібна унікальність (електронні адреси, логіни, 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 не запобігає дублікатам.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ