Колекції в Java. Частина 2: HashSet, HashMap та іншті

Продовжуємо огляд колекцій в Java. У цій статті детально розглянемо колекції HashSet та HashMap.

HashSet та його особливості

HashSet в Java це клас, який реалізує інтерфейс Set. Він використовує хеш-таблицю для зберігання елементів, яка дозволяє виконувати операції додавання, видалення та перевірки наявності елемента за сталу часову складність – O(1), в середньому.

HashSet не зберігає елементи в впорядкованому порядку і не дозволяє дублікатів. Це означає, що кожен елемент в HashSet є унікальним.

Методи HashSet

Деякі з основних методів, що надає HashSet, включають:

  • add(E e): додає елемент в цей набір, якщо його ще не було.
  • clear(): видаляє всі елементи з цього набору.
  • contains(Object o): повертає true, якщо цей набір містить вказаний елемент.
  • isEmpty(): повертає true, якщо цей набір не містить елементів.
  • iterator(): повертає ітератор для елементів в цьому наборі.
  • remove(Object o): видаляє вказаний елемент з цього набору, якщо він є в наборі.
  • size(): повертає кількість елементів в цьому наборі.

Приклади використання HashSet

Створення HashSet та додавання елементів:


HashSet set = new HashSet();
set.add("Apple");
set.add("Banana");
set.add("Cherry");

Перевірка наявності елемента в наборі:


if(set.contains("Apple")){
    System.out.println("Apple is in the set");
}

Видалення елемента з набору:


set.remove("Apple");

Перебіг по всім елементам набору:


for(String fruit : set){
    System.out.println(fruit);
}

Що таке HashMap та його особливості

HashMap у Java є частиною Java Collections Framework і реалізує інтерфейс Map. HashMap використовує хеш-таблицю для зберігання пар “ключ-значення”. Воно дозволяє виконувати операції додавання, видалення та пошуку за сталу середню часову складність — O(1).

Особливості HashMap

  1. HashMap зберігає пари “ключ-значення” і дозволяє використовувати ключ для отримання відповідного значення.
  2. Ключі в HashMap є унікальними, тобто вони не допускають дублікатів.
  3. Значення в HashMap можуть бути дублікатами.
  4. HashMap дозволяє вставляти null як ключ або значення.
  5. HashMap не зберігає порядок вставки ключів/значень.

Методи HashMap

Деякі з основних методів HashMap включають:

  • put(K key, V value): зберігає пару “ключ-значення” в HashMap.
  • get(Object key): повертає значення для даного ключа.
  • containsKey(Object key): перевіряє, чи є вказаний ключ у HashMap.
  • containsValue(Object value): перевіряє, чи є вказане значення у HashMap.
  • remove(Object key): видаляє пару “ключ-значення” з HashMap для вказаного ключа.
  • clear(): видаляє всі пари “ключ-значення” з HashMap.

Приклади використання HashMap

Створення HashMap та додавання пар “ключ-значення”:


HashMap map = new HashMap();
map.put("Apple", 10);
map.put("Banana", 20);
map.put("Cherry", 30);

Отримання значення за ключем:


int value = map.get("Apple"); // value will be 10

Видалення пари “ключ-значення” за ключем:


map.remove("Apple");

Перебіг по всім ключам:


for(String key : map.keySet()){
    System.out.println("Key: " + key + ", Value: " + map.get(key));
}

Основні відмінності між HashMap і HashSet

HashMap та HashSet є двома різними типами колекцій в Java, кожна з яких використовує хешування для зберігання даних. Однак вони мають ряд відмінностей:

  1. Тип даних: HashMap зберігає пари “ключ-значення”, в той час як HashSet зберігає лише унікальні об’єкти.
  2. Унікальність: В HashMap ключі повинні бути унікальними, в той час як значення можуть бути однаковими. У HashSet всі об’єкти повинні бути унікальними.
  3. Null значення: HashMap дозволяє одне null значення ключа та кілька null значень. З іншого боку, HashSet дозволяє одне null значення.

Коли краще використовувати HashMap або HashSet

Вибір між HashMap і HashSet залежить від специфічних потреб вашої програми:

  • Використовуйте HashMap, коли вам потрібно зберігати пари “ключ-значення”, і вам потрібно швидко отримати доступ до значення за допомогою ключа.
  • Використовуйте HashSet, коли вам потрібно перевірити наявність конкретного елементу швидко та ви не потребуєте пар “ключ-значення”.

Порівняльна таблиця HashMap та HashSet

HashMapHashSet
ЗберігаєПари “ключ-значення”Унікальні об’єкти
УнікальністьКлючі повинні бути унікальнимиВсі об’єкти повинні бути унікальними
Null значенняДозволяє одне null значення ключа та кілька null значеньДозволяє одне null значення
ВикористанняКоли потрібно зберігати пари “ключ-значення”Коли потрібно зберігати унікальні елементи

Інші важливі колекції в Java

TreeMap

TreeMap в Java є реалізацією інтерфейсу Map, що забезпечує ефективне зберігання пар “ключ-значення” в відсортованому порядку. Ключі в TreeMap автоматично сортуються за своїм природним порядком або за порядком, визначеним компаратором. TreeMap використовується, коли потрібне ефективне зберігання даних з можливістю швидкого доступу до них у відсортованому вигляді.

TreeSet

TreeSet це реалізація Set інтерфейсу, яка зберігає унікальні елементи в відсортованому порядку. Подібно до TreeMap, TreeSet сортує елементи відповідно до їх природного порядку або використовує компаратор для визначення порядку. TreeSet використовується, коли ви хочете зберігати унікальні елементи в відсортованому вигляді.

Stack

Stack в Java це реалізація стеку, структури даних, що працює за принципом “останній прийшов – перший вийшов” (LIFO). Він використовується в алгоритмах, де важливий порядок елементів.

Queue

Queue в Java це інтерфейс, який реалізує структуру даних “черга”, що працює за принципом “перший прийшов – перший вийшов” (FIFO). Queue використовується в алгоритмах, де порядок обробки елементів важливий.

PriorityQueue

PriorityQueue в Java це реалізація черги з пріоритетами, де елементи обробляються відповідно до їх приоритету. PriorityQueue використовується в алгоритмах, де потрібно обробляти елементи в порядку їх пріоритету.

Deque

Deque в Java це інтерфейс, який реалізує двосторонню чергу. Елементи можуть бути додані або видалені з обох кінців. Він використовується в алгоритмах, де потрібно забезпечити гнучкий доступ до елементів з обох кінців структури даних.

Заключення

Вивчення та розуміння колекцій у Java є однією з найважливіших складових ефективної розробки програмного забезпечення. Колекції надають розробникам потужний інструмент для організації та обробки даних, забезпечуючи швидкий доступ, зручність пошуку та гнучкість в оперуванні об’єктами.

Різні типи колекцій в Java мають свої унікальні характеристики, які роблять їх відмінним вибором для конкретних задач. Наприклад, ArrayList і LinkedList обидва реалізують List інтерфейс, але їх внутрішня структура та поведінка робить їх більш або менш підходящими для різних сценаріїв. Аналогічно, вибір між HashSet і TreeSet залежить від того, чи потрібно вам зберігати елементи в відсортованому порядку.

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

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

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

Site Footer