JavaRush/Курсы/JAVA 25 SELF/«Свой словарь» — HashMap&l...

«Свой словарь» — HashMap<K,V>

Открыта

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}

Разберём подробно, что здесь происходит:

  1. Мы разделили строку "java java core java" на слова.
  2. Для каждого слова смотрим, есть ли оно уже в словаре (freq.get(w)).
  3. Если его нет (null), значит, это первое появление слова → кладём 1.
  4. Если есть, значит, слово уже встречалось → увеличиваем значение на единицу.

Реальные применения:

  • подсчёт количества обращений к 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. В конце можно вывести весь список. Словари очень часто используются в реальных проектах.

1
Задача
JAVA 25 SELF,  12 уровень,  2 лекция
Недоступна
Добавление и получение значения
Добавление и получение значения
1
Задача
JAVA 25 SELF,  12 уровень,  2 лекция
Недоступна
Проверка наличия ключа
Проверка наличия ключа
1
Задача
JAVA 25 SELF,  12 уровень,  2 лекция
Недоступна
Удаление элемента из словаря
Удаление элемента из словаря
1
Задача
JAVA 25 SELF,  12 уровень,  2 лекция
Недоступна
Подсчёт количества слов в тексте
Подсчёт количества слов в тексте
Комментарии (19)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
StepV System Engineer
14 апреля, 13:35
Хотелось бы увидеть в лекции подробное описание про методы getValue() и getKey(), последние примеры тяжело читаются для НЕ программиста :)
Let's Weapon
Уровень 16
22 сентября, 12:23
согласен, но когда просидишь N кол-во времени с желанием понимая, то все становится просто и до смеху логично!)
Юрий
Уровень 25
5 марта, 20:50
Последняя задача отличная. Остался вопрос, какой тип переменой возвращается при переборе всех элементов через for-each коллекции HashMap.
Marat Safiianov
Уровень 38
10 апреля, 14:53
возвращается пара
KEN Software Developer
7 мая, 17:00
Map.Entry<String, Integer>
Вот так бы выглядел тип данных если не var. Что это значит? Представьте что данные будут лежать так: Entry 1: ключ, значене Entry 2: ключ, значене Entry 3: ключ, значене А Map - это интерфейс, который описывает как работать с одной из пар.
// Это НЕ класс, а интерфейс (как контракт)
public interface Entry<K, V> {
    K getKey();      // получить ключ
    V getValue();    // получить значение
    V setValue(V value);  // изменить значение
}
Но, для того что бы это работало, нужно не забыть импортировать класс! Вот так:
import java.util.Map;
Либо полный путь, тогда класс импортировать не нужно:
java.util.Map.Entry<String, String>
Лучше просто var:)
Олег Сычев Java Developer
15 февраля, 20:51
Понравилась задача "Подсчёт количества слов в тексте" - что б ее решить не подсматривая в лекцию, пришлось реально мозг поднапрячь. Все бы такие были и без явных ответов в лекции.
Grrbrr7 System Engineer
11 ноября 2025, 16:54
Что бы я делал без ИИ. Примеры в п.7 просто взорвал мозг
Roman
Уровень 20
15 ноября 2025, 17:57
Пока в дебагере не прогнал, ни какой ии не помог понять
25 ноября 2025, 07:33
А что там такого? Пробегаемся циклом по словам из строки(которую преобразовали в массив), затем добавляем в переменную old значение по ключу (слову). Добавляем в хэшмапу новое слово: тут тернарный оператор, смысл которого в том, что если у нас old == null (то есть по такому ключу еще нет значения == слово встретилось впервые), то он в количество добавляет единицу. А если не null (значит слово уже было в словаре), то прибавляет единицу к тому числу, которое уже было.
Ksanders
Уровень 32
15 октября 2025, 14:49
А для чего в правой части снова указываются типы ключ-значение?
Создание словаря
Чтобы создать словарь, нужно указать, какие типы будут ключами и значениями.

import java.util.HashMap;

HashMap<String, String> phonebook = new HashMap<String, String>();
Alina GabidulinaРаботает в M2
26 октября 2025, 14:46
HashMap<String, String> — это тип переменной phonebook. Он говорит компилятору: в этом словаре ключи и значения — строки (String). new HashMap<String, String>() — это создание объекта (вызов конструктора). Здесь мы снова указываем типы (<String, String>), чтобы Java знала, какие типы использовать при создании объекта.
Alina GabidulinaРаботает в M2
26 октября 2025, 14:48
до 7 джавы надо так делать, но после можно не писать, хз почему правда тут так написали, скорее всего для наглядности и потом по ходу курса мы уже узнаем про то, что так можно не делать
SB
Уровень 115
14 апреля, 13:00
new HashMap() - тоже работает. )
Александр
Уровень 50
10 октября 2025, 17:03
Интересно, пример в п. 7 - это дурной тон или нормальная практика? Режет глаз.
Ksanders
Уровень 32
15 октября 2025, 16:21
скорее дурная, учитывая тот факт, что комментариев по коду нет, только после самого блока с кодом объяснение
akanorei
Уровень 1
31 октября 2025, 12:27
IDE сама предлагает заменить на вызов compute метода данную конструкцию
24 декабря 2025, 19:34
Просто когда писались эти примеры, метода compute, видимо, ещё не было.
German Malykh QA Automation Engineer
21 сентября 2025, 19:30
Опечатка Правильно
phonebook.put("Алиса", "+380501112233");
phonebook.put("Боб", "+380671234567");

// System.out.println("Телефон Боба " + phonebook.get("Боб"));
// Телефон Боба +380671234567

// System.out.println("Телефон Алисы " + phonebook.get("Алиса"));
// Телефон Алисы +380501112233
и т.д
5 февраля, 16:07
Скорее всего проблемы с локализацией