JavaRush /Курси /JAVA 25 SELF /Інтерфейси Collection, List, Set, Map: ієрархія

Інтерфейси Collection, List, Set, Map: ієрархія

JAVA 25 SELF
Рівень 27 , Лекція 0
Відкрита

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. Візуалізація ієрархії: усе на одній картинці

Невелика зведена таблиця:

Інтерфейс Опис Приклади реалізацій Ключові особливості
List
Впорядкований список
ArrayList, LinkedList
Доступ за індексом, дублікати
Set
Множина унікальних значень
HashSet, TreeSet
Лише унікальні елементи
Map
Пари ключ–значення
HashMap, TreeMap
Ключі унікальні, значення будь-які

Ієрархія на схемі:

                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 не запобігає дублікатам.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ