Введення

Практично у всіх програмах виникає потреба зберігати набір будь-яких даних. Це можуть бути рядки та числа, об’єкти тощо. Для цих цілей дуже доречними є масиви. Але масиви мають деякі обмеження. Наприклад, фіксований розмір, відсутність можливості видаляти елементи, вставляти елементи всередину. Для обходу цього та інших обмежень створили колекції. У всіх типах колекцій (а їх багато, як ми побачимо далі протягом цієї лекції) є можливість динамічно змінювати свій розмір. Деякі типи колекцій можуть зберігати впорядковані елементи та автоматично впорядковувати нові елементи в міру їхнього додавання.

У цій лекції ми ознайомимося з ієрархією класів базових колекцій Java Collections Framework. Ще існують різні альтернативні бібліотеки, які розширюють можливості стандартної Java Collections Framework. Напопулярніша з них — Guava (Google Collections Library).

* На схемі представлені далеко не всі інтерфейси та класи. Деякі пропущені для простоти розуміння

Основні інтерфейси

На схемі видно, що є два основні інтерфейси, від яких реалізуються інші класи та інтерфейси колекцій.

Давай розглянемо ці інтерфейси:

  1. Collection – звичайна колекція, що містить набір окремих елементів (об’єктів). У цій колекції є основні методи роботи з елементами: вставлення (add, addAll), видалення (remove, removeAll, clear), пошук (contains, containsAll), перевірка на порожнечу колекції (isEmpty) і розмір (size).

  2. Map — колекція, структура якої представляє пари «ключ-значення». Причому в межах однієї Map кожен ключ є унікальним: немає двох однакових за значенням ключів. Також цю колекцію іноді називають словником (dictionary). Map — це окремий інтерфейс. Він не реалізує інтерфейс Collection, але входить до Java Collections Framework.

Основні методи для роботи з елементами Map:

  • вставлення (put, putAll)

  • отримання (get, keySet, values, entrySet)

  • видалення (remove, clear)

  • пошук (containsKey, containsValue)

  • перевірка на порожнечу колекції (isEmpty)

  • розмір (size)

А тепер давай докладніше поговоримо про кожний із них.

Інтерфейс Collection

Інтерфейс Collection розширяє інтерфейс Iterable, а цей інтерфейс має єдиний метод iterator(). Для нас це означає, що будь-яка колекція, яка успадковується від Iterable, вмітиме повертати ітератор.

Ітератор – це спеціальний об’єкт, за допомогою якого можна отримати доступ до елементів будь-якої колекції без врахування особливостей її реалізації.

З рисунка видно, що від інтерфейсу Collection успадковується 3 інтерфейси: List, Queue і Set. Зараз стисло розглянемо кожний із них.

List — це впорядкована колекція, яка допускає дублікати серед значень. Також можна зустріти й інші назви — послідовність (sequence), список. Особливістю List є те, що елементи пронумеровані і до них можна звертатися за номером (індексом).

Queue — перекладається з англійської як черга. Правильна вимова: Queue — К’Ю. В Queue елементи зберігаються в порядку додавання їх до черги.

Set – на відміну від списку, описує невпорядковану колекцію, в якій немає повторів елементів. У Set є відповідність із поняттям у математиці — множина (set).

Реалізація інтерфейсу Map

В інтерфейсі Map ми можемо бачити співвідношення унікальних ключів із значеннями.


interface Мар<К, V>

де К — це тип ключів, а V — тип значень, що зберігаються.

За ключем ми можемо отримувати дані з Map. Щоб додати елемент в Map, потрібно вказати ключ і значення.

Розглянемо деякі реалізації Map:

  1. HashMap — реалізація Map, в основі якої лежать хеш-таблиці. Може зберігати ключі та значення будь-яких типів, зокрема і null. Порядок елементів не гарантовано.

  2. LinkedHashMap — структура даних, зберігає дані у вигляді зв’язного списку елементів. Елементи розташовані в порядку, в якому вони додавалися.

  3. TreeMap — реалізує інтерфейс SortedMap (через NavigableMap). Елементи у такій структурі зберігаються у відсортованому вигляді (у разі додавання нового елемента колекція сортується автоматично). TreeMap чудово підходить для зберігання великих обсягів відсортованої інформації із здійсненням швидкого пошуку.

Застарілі колекції

Від попередніх версій Java залишилися застарілі колекції (для підтримання зворотної сумісності), які використовувати не рекомендується:

  • Enumeration — аналог інтерфейсу Iterator;

  • Vector — впорядкований список елементів, аналог класу ArrayList;

  • Stack — структура, яка реалізує зберігання елементів за принципом стека (наприклад, стопка книг), є методи заштовхування (push) і виштовхування (pop) елементів;

  • Dictionary — аналог інтерфейсу Map, але є абстрактним класом;

  • Hashtable — аналог HashMap.

Докладніше про Collections Framework ти можеш прочитати у цій статті .