1. Контейнери та колекції
Контейнери або колекції називають класи, які дозволяють зберігати і обробляти багато об'єктів одразу. Ви вже знаєте два різновиди контейнерів — масиви та списки.
У Java є кілька десятків колекцій, кожна з яких зберігає елементи своїм специфічним способом. Ось деякі з них:
| Тип колекції | Клас | Опис |
|---|---|---|
|
|
Список |
|
Зв’язаний список | |
|
Вектор | |
|
Стек | |
|
|
Множина |
|
||
|
||
|
|
Черга |
|
||
|
|
Карта/Словник |
|
||
|
||
Тут є певна неоднозначність з назвами. Хоча у більшості мов програмування всі ці структури даних прийнято називати колекціями, у Java це не зовсім так. У мові Java деякі з цих класів реалізують інтерфейс Collection, тоді як інші — ні.
Тому колекції розділилися на колекції у широкому сенсі та колекції у вузькому сенсі (лише ті, які реалізовують інтерфейс Collection).
Тож, щоб не плутатися, колекціями називають лише колекції у вузькому сенсі (класи мають реалізовувати інтерфейс Collection). Це всі колекції типу List, Set і Queue. Колекції ж у широкому сенсі прийнято називати контейнерами. До них належать класи типу Map та масиви.
2. Колекція HashSet
Клас HashSet є типовим представником колекцій типу «множина». У багатьох аспектах він схожий на клас ArrayList, і в певному сенсі є його більш примітивною версією.
Створити об'єкт типу HashSet можна за допомогою команди виду:
HashSet<Тип> ім'я = new HashSet<Тип>();
Де тип – це тип елементів, які можна зберігати у колекції HashSet.
У класу HashSet є такі методи:
| Метод | Опис |
|---|---|
|
Додає елемент value у колекцію |
|
Видаляє елемент value з колекції.Повертає true, якщо такий елемент був |
|
Перевіряє, чи є в колекції елемент value |
|
Очищає колекцію: видаляє всі елементи |
|
Повертає кількість елементів у колекції |
Приклад використання множини.
Напишемо програму, яка прощається з користувачем, якщо він привітався з нею: якщо користувач сказав привіт. Для більшого інтересу «привіт» можна буде казати кількома мовами.
| Код | Примітка |
|---|---|
|
Створюємо об'єкт типу HashSet, який зберігає елементи типу String.Заносимо в set привітання різними мовами.Вводимо з консолі слово, якщо це слово є в нашій множині привітань, то прощаємося (українською). |
3. Множина
Колекція Set створена для зберігання множини елементів. Тому її так і називають Set (множина). У цієї колекції є три особливості.
Операції над множиною
З множиною можна робити лише три операції: додавати елементи до множини, видаляти елементи з множини і перевіряти, чи є в множині певний елемент. Все.
Відсутність порядку
У елементів цієї колекції немає номерів. Не можна отримати елемент за його індексом або записати значення у колекцію за певним індексом. Методів get() і set() у множини немає.
Унікальність елементів
Усі елементи множини унікальні. На відміну від списку, у множині один елемент може бути лише раз. Об'єкт або знаходиться в множині, або ні: третього не дано. Не можна в «множину кольорів» тричі додати «чорний колір». Він там або є, або його немає.
Пошук елементів
Коли ви додаєте у множину новий елемент, видаляєте елемент, або перевіряєте наявність елемента, всередині методу виконується пошук елемента. Елементи колекції і переданий елемент порівнюються спочатку за hashCode(), а якщо hashCode() збігаються, то за equals.
4. Порівняння колекцій: List vs Set
Давайте порівняємо колекції двох типів: List і Set. У чому ж їх основні відмінності і коли вигідніше використовувати одну, а коли – іншу.
Давайте спробуємо порівняти Список і Множину на прикладі дитячих іграшок.
Колекція List (Список) схожа на набір іграшок у дитячій кімнаті, розташованих біля стіни. Можна додати іграшку у кінець списку. Можна вставити і в середину, якщо дуже потрібно (але частину іграшок доведеться пересунути).
У кожної іграшки є порядковий номер. Можна взяти іграшку за її номером або замінити іграшку номер 7 на іграшку номер 13. Можна видалити зі списку іграшку номер 4. Ну і нарешті, можна дізнатися кількість усіх іграшок у списку.
Колекція Set (Множина) більше схожа на іграшки, скинуті в купу. У купу можна додати іграшку, можна видалити іграшку з купи. Але фіксованого номера у таких іграшок немає.
Або припустімо, ви обираєте дитині іграшку на день народження. Тоді ви насамперед думаєте, чи є у нього така іграшка чи ні. Тоді всі іграшки, які у нього є, утворюють множину іграшок, які ви вирішили не купувати.
З цієї точки зору порядок іграшок у наборі «вже є» не грає ролі, як і наявність у іменинника двох однакових іграшок. Вас цікавлять не самі іграшки і їх кількість, а іграшки як набір певних унікальних об'єктів.
Ось для таких випадків вам і знадобиться множина Set і її найпопулярніший представник – клас HashSet.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ