1. Вступ
Ми вже знаємо, що ArrayList — це «нескінченний масив», який сам розширюється. Але у нього є одне обмеження: доступ до елементів здійснюється за індексом. Якщо в нас є список з тисячі людей і ми хочемо знайти телефон Аліси, доведеться або знати її індекс, або перебирати всіх поспіль.
У житті ми часто шукаємо дані за унікальною ознакою:
- за імʼям шукаємо номер телефону,
- за номером паспорта шукаємо власника,
- за логіном знаходимо пароль,
- за ID шукаємо обʼєкт у базі.
Для цього потрібна структура, яка вміє: «отримавши ключ → одразу знайти значення». У Java за це відповідає HashMap<K,V>.
Аналогія:
Уявіть звичайний паперовий словник. Ви шукаєте переклад слова «house». Вам не потрібно гортати всі сторінки підряд. Ви одразу переходите на літеру «H» і знаходите потрібне слово. Так само працює й HashMap: за ключем (слово) ми миттєво отримуємо значення (переклад).
Створення словника
Щоб створити словник, треба вказати, які типи будуть ключами і значеннями.
import java.util.HashMap;
HashMap<String, String> phonebook = new HashMap<String, String>();
Тут:
- String (перший тип) — це тип ключа (імʼя людини).
- String (другий тип) — це тип значення (номер телефону).
Тепер phonebook — це як справжня телефонна книга.
Приклади інших варіантів:
HashMap<String, Integer> grades = new HashMap<String, Integer>(); // імʼя → оцінка
HashMap<Integer, String> users = new HashMap<Integer, String>(); // ID → імʼя
HashMap<String, Boolean> flags = new HashMap<String, Boolean>(); // ключ → логічне значення
На відміну від ArrayList, у словника немає методу add(), натомість є свої не менш цікаві методи.
2. Метод put(key, value) — додати пару
Головна відмінність HashMap від масивів і списків полягає в тому, що він зберігає не просто набір значень, а пари ключ–значення. Це робить його схожим на справжній словник: у кожного слова є переклад, у кожного імені — телефон, у кожного логіна — пароль.
Приклад:
phonebook.put("Аліса", "+380501112233");
phonebook.put("Боб", "+380671234567");
Тепер у нашій телефонній книзі:
- ключ "Аліса" повʼязаний зі значенням "+380501112233",
- ключ "Боб" повʼязаний зі значенням "+380671234567".
Це означає, що для отримання значення (телефону) потрібно знати ключ (імʼя).
Важливо памʼятати: ключі унікальні. Якщо ми спробуємо додати нове значення за вже існуючим ключем, старе значення буде перезаписане.
phonebook.put("Аліса", "+10999999999");
Тепер в Аліси залишився лише новий номер; старий втрачено.
Висновок: put — це метод для додавання або оновлення записів. Якщо ключ новий — запис створюється. Якщо ключ уже є — запис оновлюється.
3. Метод get(key) — отримати значення
Щоб знайти значення, треба знати ключ. Це і є головна перевага HashMap: пошук за ключем працює дуже швидко, майже миттєво, незалежно від того, чи маємо тисячу записів, чи мільйон.
Приклад:
System.out.println(phonebook.get("Аліса"));
Виведення:
+380501112233
Якщо такого ключа немає, get поверне null:
System.out.println(phonebook.get("Чарлі")); // null
Це означає: «ключа "Чарлі" у словнику немає».
4. Метод containsKey(key) — перевірити наявність
Щоб не натрапити на null, корисно спочатку перевірити, чи є ключ у словнику.
Приклад:
System.out.println(phonebook.containsKey("Чарлі"));
Виведення:
false
Таким чином, ми можемо заздалегідь зрозуміти:
- якщо ключа немає — створюємо новий запис,
- якщо ключ є — оновлюємо його.
Поширений прийом:
if (phonebook.containsKey("Аліса"))
{
System.out.println("У Аліси вже є номер!");
}
else
{
phonebook.put("Аліса", "+10111111111");
}
5. Метод remove(key) — видалити запис
Видалення працює так само просто: треба знати лише ключ.
phonebook.remove("Боб");
System.out.println(phonebook.get("Боб"));
Виведення:
null
Тепер запису з ключем "Боб" у словнику більше немає.
6. Перебирання всіх пар
Часто потрібно не лише отримати дані за конкретним ключем, а й вивести увесь словник цілком. Для цього використовується метод entrySet().
for (var entry : phonebook.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
Приклад виведення:
Аліса -> +380501112233
Таким чином, ми одразу отримуємо доступ і до ключа (entry.getKey()), і до значення (entry.getValue()).
7. Практика: підрахунок слів
Розгляньмо класичну задачу — підрахунок кількості повторів слів у тексті. Це один із найяскравіших прикладів, навіщо взагалі потрібен HashMap.
String text = "java java core java";
HashMap<String, Integer> freq = new HashMap<String, Integer>();
for (String w : text.split(" "))
{
Integer old = freq.get(w);
freq.put(w, (old == null) ? 1 : old + 1);
}
System.out.println(freq);
Виведення:
{core=1, java=3}
Розберімо докладно, що тут відбувається:
- Ми розбили рядок "java java core java" на слова.
- Для кожного слова дивимося, чи є воно вже у словнику (freq.get(w)).
- Якщо його немає (null), отже, це перша поява слова → кладемо 1.
- Якщо є, отже, слово вже траплялося → збільшуємо значення на одиницю.
Реальні застосування:
- підрахунок кількості звернень до API,
- статистика частоти слів у тексті,
- зберігання кількості товарів на складі.
8. Практика: телефонна книга
Напишімо трохи більший застосунок.
import java.util.HashMap;
import java.util.Scanner;
public class PhonebookApp {
public static void main(String[] args)
{
HashMap<String, String> phonebook = new HashMap<String, String>();
Scanner console = new Scanner(System.in);
while (true)
{
System.out.print("Введіть імʼя (або порожній рядок для виходу): ");
String name = console.nextLine();
if (name.isEmpty()) break;
System.out.print("Введіть номер: ");
String phone = console.nextLine();
phonebook.put(name, phone);
}
System.out.println("Телефонна книга:");
for (var entry : phonebook.entrySet())
{
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
}
}
Програма працює як міні‑довідник. Ви вводите імена та телефони — вони зберігаються у HashMap. Наприкінці можна вивести весь список. Словники дуже часто використовуються в реальних проєктах.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ