1. Контейнери та колекції

Контейнерами або колекціями називають класи, які дають змогу зберігати й обробляти багато об'єктів одразу. Ви вже знаєте два різновиди контейнерів — масиви та списки.

У Java є кілька десятків колекцій, кожна з яких зберігає елементи у свій особливий спосіб. Ця таблиця містить скорочений перелік колекцій:

Тип колекції Клас Опис
List
ArrayList
Список
LinkedList
Зв'язаний список
Vector
Вектор
Stack
Стек (стос)
Set
HashSet
Множина
TreeSet
LinkedHashSet
Queue
PriorityQueue
Черга
ArrayDeque
Map
HashMap
Карта/Словник
TreeMap
HashTable

Тут є певна неоднозначність у назвах. Хоча в більшості мов програмування всі ці структури даних називають колекціями, у Java це не так. У мові Java деякі з цих класів реалізують інтерфейс Collection, а інші — ні.

Тому колекції розділили на колекції в широкому сенсі й колекції у вузькому сенсі (тільки ті, які реалізують інтерфейс Collection).

Отже, щоб не плутатися, колекціями називають тільки колекції у вузькому сенсі (класи мають реалізовувати інтерфейс Collection). Це всі колекції типів List, Set і Queue. А колекції в широкому сенсі називають контейнерами. Це класи типу Map і масиви.


2. Колекція HashSet

Клас HashSet є типовим представником колекцій типу «множина». Багато в чому він схожий на клас ArrayList і в певному сенсі є його спрощеною версією.

Створити об'єкт типу HashSet можна за допомогою такої команди:

HashSet<Тип> ім'я = new HashSet<Тип>();

де тип — це тип елементів, які можна зберігати в колекції HashSet.

Клас HashSet має такі методи:

Метод Опис
boolean add(Тип value)
Додає елемент value в колекцію
boolean remove(Тип value)
Видаляє елемент value з колекції.
Повертає true, якщо такий елемент там був.
boolean contains(Тип value)
Перевіряє, чи є в колекції елемент value
void clear()
Очищає колекцію: видаляє всі елементи
int size()
Повертає кількість елементів у колекції

Приклад використання множини.

Спробуймо написати програму, яка прощається з користувачем, якщо він з нею привітався, тобто сказав «Привіт». Щоб було цікавіше, слово «Привіт» можна буде сказати декількома мовами.

Код Примітка
HashSet<String> set = new HashSet<String>();

set.add("Привіт");
set.add("Hello");
set.add("Hola");
set.add("Bonjour");
set.add("Ciao");
set.add("Namaste");

Scanner console = new Scanner(System.in);
String str = console.nextLine();

if (set.contains(str))
   System.out.println("Да спаткання!");
Створюємо об'єкт типу HashSet, який зберігає елементи типу String.


Записуємо в set привітання різними мовами.




Вводимо з консолі слово;


якщо це слово є в нашій множині привітань, то прощаємося (білоруською мовою).


3. Множина

Колекція Set призначена для зберігання множини елементів. Тому її так і називають: Set (множина). Ця колекція має три особливості.

Операції з множинами

Із множинами можна виконувати тільки три операції: додавати елементи до множини, видаляти елементи з множини і перевіряти, чи є в множині певний елемент. Це все.

Невпорядкованість

Елементи цієї колекції не мають номерів. Неможливо отримати елемент за його індексом або записати значення в колекцію за певним індексом. Методів get() і set() множина також не має.

Унікальність елементів

Усі елементи множини є унікальними. На відміну від списку, у множині кожний елемент може бути тільки в одному примірнику. Об'єкт або міститься у множині, або ні: третього не дано. Неможливо тричі додати «чорний колір» у множину кольорів. Він там або є, або його немає.

Пошук елементів

Коли ви додаєте до множини новий елемент, видаляєте елемент або перевіряєте наявність елемента, всередині методу виконується пошук елемента. Елементи колекції та переданий елемент порівнюються спочатку за допомогою методу hashCode(), а якщо отримані хеш-значення збігаються, то за допомогою методу equals.



4. Порівняння колекцій: List і Set

Порівняймо колекції двох типів: List і Set. Які між ними основні відмінності, і коли вигідніше використовувати одну, а коли — другу?

Спробуймо порівняти Список і Множину на прикладі дитячих іграшок.

Колекція List (Список) схожа на набір іграшок в дитячій кімнаті, які розставлено біля стіни. Можна додати іграшку в кінець списку. Можна вставити її в середину, якщо дуже потрібно (але частину іграшок доведеться пересунути).

Кожна іграшка має порядковий номер. Можна взяти іграшку за її номером або замінити іграшку номер 7 на іграшку номер 13. Можна видалити зі списку іграшку номер 4. Ну і зрештою можна дізнатися кількість усіх іграшок у списку.

Колекція Set (множина) більше схожа на іграшки, скинуті на купу. У купу можна додати іграшку, можна видалити іграшку з купи, але фіксованого номера в таких іграшок немає.

Або, припустімо, ви вибираєте дитині іграшку на день народження. Тоді ви в першу чергу думаєте, є в дитини така іграшка чи ні. Тож усі іграшки, які в неї є, утворюють множину іграшок, які ви не купуватимете.

У такому разі порядок іграшок в наборі «Вже є» не має значення, так само як і наявність в іменинника двох однакових іграшок. Вас цікавлять не самі іграшки та їх кількість, а іграшки як набір певних унікальних об'єктів.

Саме для таких випадків вам і знадобиться множина Set та її найпопулярніший представник — клас HashSet.