JavaRush /Курси /JAVA 25 SELF /Огляд колекцій Java — навіщо потрібні колекції

Огляд колекцій Java — навіщо потрібні колекції

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

1. Вступ

Колись ми з вами вже розбиралися з «нескінченними масивами» — списками. Поглибімо знання та ще раз поставмо запитання: що таке «класичний» масив? Якщо придивитися, він нагадує коробку для інструментів із фіксованою кількістю відділень. Припустімо, у коробці є 10 комірок. У вас зʼявився 11-й інструмент — що тепер? Доведеться купувати нову коробку! Так само й традиційний масив має фіксований розмір, а після створення його довжину вже не змінити.

Якщо потрібно додати або видалити елемент, доводиться створювати новий масив і копіювати дані вручну. У масиві легко й швидко можна знайти елемент за індексом, натомість вставити елемент у середину масиву — це не просто «вставити», а «зсунути все праворуч», а під час видалення — «зсунути все ліворуч». Це повільно й незручно. Крім того, масив не містить жодної додаткової «логіки»: він просто тримає набір комірок, а вже сортування, пошук за вмістом чи перевірку унікальності доводиться робити зовнішніми засобами.

Приклад: динамічний список студентів

Припустімо, ви пишете застосунок для обліку студентів у групі. Спочатку у групі 5 осіб, потім прийшов ще один, згодом хтось пішов. З масивом це виглядало б так:

String[] students = new String[5];
students[0] = "Іван";
students[1] = "Марія";
// і так далі...

// Ой, прийшов ще один студент
// Потрібно створювати новий масив!
String[] newStudents = new String[6];
for (int i = 0; i < students.length; i++) {
    newStudents[i] = students[i];
}
newStudents[5] = "Олексій";
students = newStudents;

Зручно? Мʼяко кажучи, ні. А якщо таких операцій багато? Тут уже хочеться чогось зручнішого…

2. Що таке колекція?

Колекція — це обʼєкт, який слугує контейнером для зберігання групи інших обʼєктів (елементів). Колекції дають змогу додавати, видаляти, перебирати елементи, а також виконувати інші операції: пошук, сортування, фільтрацію тощо.

У Java всі колекції реалізують або наслідують від інтерфейсу Collection (або для відображень — від Map). Колекція — це не просто «купа чогось», а структура, що надає зручний, продуманий набір методів для роботи з елементами.

Чому колекції — це обʼєкти?

Тому що колекції реалізовані як класи, а отже, ви можете створювати колекції будь-яких обʼєктів, комбінувати їх, успадковувати, розширювати, використовувати у своїх класах і методах.

Приклад:

import java.util.ArrayList;
import java.util.List;

List<String> students = new ArrayList<>();
students.add("Іван");
students.add("Марія");
students.add("Олексій");

Готово! Тепер ви можете додавати скільки завгодно студентів, не переймаючись розміром масиву.

3. Типові задачі, які розв’язують колекції

Колекції — це швейцарський ніж для роботи з даними. Ось які завдання вони допомагають розв’язувати:

  • Зберігання динамічного списку даних: наприклад, список студентів, завдання в планувальнику, повідомлення в чаті.
  • Пошук і фільтрація: швидко знайти елемент, перевірити його наявність, отримати всі елементи, що задовольняють певну умову.
  • Сортування: легко відсортувати елементи за потрібним критерієм.
  • Видалення й додавання елементів: вставляти й видаляти елементи в будь-якому місці колекції без ручного копіювання масивів.
  • Групування за ключем: наприклад, телефонна книга, де кожному імені відповідає номер телефону.
  • Гарантія унікальності: наприклад, множина всіх унікальних слів у тексті.

Приклад: телефонна книга

З масивом:

  • Як знайти номер за іменем? Доведеться перебирати масив і порівнювати імена.
  • Як додати нову пару? Доведеться розширювати масив.
  • Як гарантувати, що імена не повторюються? Ще складніше.

З колекцією:

  • Використовуємо Map<String, String> — і все працює одразу.

4. Огляд основних видів колекцій

У Java колекції поділяються на три основні групи:

Вид колекції Інтерфейс/Клас Для чого використовується
Список List, ArrayList Упорядкована множина елементів, допускає дублікати, доступ за індексом
Множина Set, HashSet Зберігає лише унікальні елементи, порядок не гарантується
Відображення Map, HashMap Зберігає пари ключ — значення, швидкий пошук за ключем

Списки (List)

  • Упорядковані колекції, допускають дублікати.
  • Можна отримати елемент за індексом.
  • Приклади: ArrayList, LinkedList.

Множини (Set)

  • Зберігають лише унікальні елементи.
  • Немає доступу за індексом.
  • Приклади: HashSet, TreeSet.

Відображення (Map)

  • Зберігають пари ключ — значення.
  • Швидкий пошук за ключем.
  • Приклади: HashMap, TreeMap.

Візуальна схема (дуже умовна):

+------------------+       +-------------------+      +---------------------+
|     List         |       |        Set        |      |         Map         |
|------------------|       |-------------------|      |---------------------|
| [a, b, c, d, a]  |       | {a, b, c, d}      |      | {a=1, b=2, c=3}     |
| Індексація: є    |       | Індексація: немає |      | Пошук за ключем     |
| Дублікати: так   |       | Дублікати: ні     |      | Ключі унікальні     |
+------------------+       +-------------------+      +---------------------+

5. Корисні нюанси

Коли використовувати яку колекцію?

List — коли важливий порядок елементів, потрібні дублікати, потрібен доступ за індексом (наприклад, список завдань, історія повідомлень).

Set — коли потрібні лише унікальні елементи, порядок не важливий (наприклад, множина унікальних користувачів).

Map — коли потрібно зіставляти ключі та значення (наприклад, телефонна книга, де імʼя — ключ, телефон — значення).

Аналогії з життя

List — черга в їдальні: хто першим прийшов — того й обслуговують першим; можна стати в чергу кілька разів (дублікати).

Set — список гостей на вечірці: кожен гість лише один раз (унікальність).

Map — адресна книга: у кожного імені є свій телефон.

Коротка шпаргалка: колекції vs масиви

Масив (int[]) Колекція (List<Integer>)
Розмір Фіксований Динамічний
Додавання елемента Незручне Легко: add()
Видалення елемента Незручне Легко: remove()
Пошук за значенням Ручний перебір Методи: contains() тощо
Сортування Через Arrays.sort() Через Collections.sort(), методи колекцій
Підтримка унікальності Ні Через Set
Пари ключ — значення Ні Через Map

6. Зв’язок колекцій з ООП

Колекції — це обʼєкти, що реалізують певні інтерфейси (List, Set, Map). Це означає, що ви можете:

  • Зберігати в колекціях будь-які обʼєкти, зокрема екземпляри власних класів.
  • Створювати колекції колекцій (наприклад, список списків).
  • Використовувати колекції як параметри та значення, що повертаються методами.
  • Розширювати функціональність колекцій за допомогою успадкування та композиції.

Приклад: колекція обʼєктів вашого класу

import java.util.ArrayList;
import java.util.List;

class Student {
    String name;
    int age;
    // Конструктор, геттери/сеттери тощо.
}

public class Main {
    public static void main(String[] args) {
        List<Student> group = new ArrayList<>();
        group.add(new Student("Іван", 20));
        group.add(new Student("Марія", 21));
        // і так далі...
    }
}

7. Типові помилки під час роботи з колекціями

Помилка № 1: Використання колекцій без типу (raw types).
Якщо ви пишете ArrayList list = new ArrayList(), то під час додавання будь-якого обʼєкта (наприклад, рядків і чисел упереміш) компілятор не скаржитиметься, але потім, під час спроби дістати елемент і перетворити його на потрібний тип, можна отримати помилку часу виконання (ClassCastException). Завжди використовуйте узагальнення: ArrayList<String> list = new ArrayList<>().

Помилка № 2: Забули імпортувати потрібний клас.
Якщо ви бачите помилку «cannot find symbol», перевірте, чи на початку файлу є рядок import java.util.ArrayList; або потрібний імпорт для вашої колекції.

Помилка № 3: Плутанина між колекціями та масивами.
Колекція — це не масив! У колекції немає поля length, замість цього використовуйте метод size(). У масиву немає методу add(), у колекцій — оператора [] для доступу за індексом; доступ за індексом є лише у списків через get(index).

Помилка № 4: Очікування, що порядок елементів завжди зберігається.
Якщо ви використовуєте Set або Map, порядок елементів не гарантується (якщо тільки не застосовуєте спеціальні реалізації на кшталт LinkedHashSet або TreeMap). Для упорядкованих даних використовуйте List або відповідні колекції.

Помилка № 5: Використання примітивних типів у колекціях.
Колекції можуть зберігати лише обʼєкти, а не примітиви. Тобто не можна створити List<int>, лише List<Integer>. Не забувайте про класи-обгортки!

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