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");
Теперь в нашей телефонной книге:
- ключ "Алиса" связан со значением "+10501112233",
- ключ "Боб" связан со значением "+10671234567".
Это значит, что для получения значения (телефона) нам достаточно знать ключ (имя).
Важно помнить: ключи уникальны. Если мы попробуем добавить новое значение по уже существующему ключу, старое значение будет перезаписано.
phonebook.put("Алиса", "+10999999999");
Теперь у Алисы остался только новый номер: старый номер потерян.
Вывод: put — это метод для добавления или обновления записей. Если ключ новый — запись создаётся. Если ключ уже есть — запись обновляется.
3. Метод get(key) — получить значение
Чтобы найти значение, нужно знать ключ. Это и есть главная фишка HashMap: поиск по ключу работает очень быстро, практически мгновенно, независимо от того, тысяча у нас записей или миллион.
Пример:
System.out.println(phonebook.get("Алиса"));
Вывод:
+10501112233
Если такого ключа нет, 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());
}
Пример вывода:
Алиса -> +10501112233
Таким образом, мы сразу получаем доступ и к ключу (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. В конце можно вывести весь список. Словари очень часто используются в реальных проектах.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ