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

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

JAVA 25 SELF
12 уровень , 2 лекция
Открыта

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 лекция
Недоступна
Подсчёт количества слов в тексте
Подсчёт количества слов в тексте
Комментарии (11)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Grrbrr7 Уровень 20
11 ноября 2025
Что бы я делал без ИИ. Примеры в п.7 просто взорвал мозг
Roman Уровень 17
15 ноября 2025
Пока в дебагере не прогнал, ни какой ии не помог понять
Сергей Морозов Уровень 14
25 ноября 2025
А что там такого? Пробегаемся циклом по словам из строки(которую преобразовали в массив), затем добавляем в переменную old значение по ключу (слову). Добавляем в хэшмапу новое слово: тут тернарный оператор, смысл которого в том, что если у нас old == null (то есть по такому ключу еще нет значения == слово встретилось впервые), то он в количество добавляет единицу. А если не null (значит слово уже было в словаре), то прибавляет единицу к тому числу, которое уже было.
Ksanders Уровень 32
15 октября 2025
А для чего в правой части снова указываются типы ключ-значение?

Создание словаря
Чтобы создать словарь, нужно указать, какие типы будут ключами и значениями.

import java.util.HashMap;

HashMap<String, String> phonebook = new HashMap<String, String>();
Alina Gabidulina Уровень 27
26 октября 2025
HashMap<String, String> — это тип переменной phonebook. Он говорит компилятору: в этом словаре ключи и значения — строки (String). new HashMap<String, String>() — это создание объекта (вызов конструктора). Здесь мы снова указываем типы (<String, String>), чтобы Java знала, какие типы использовать при создании объекта.
Alina Gabidulina Уровень 27
26 октября 2025
до 7 джавы надо так делать, но после можно не писать, хз почему правда тут так написали, скорее всего для наглядности и потом по ходу курса мы уже узнаем про то, что так можно не делать
Александр Уровень 50
10 октября 2025
Интересно, пример в п. 7 - это дурной тон или нормальная практика? Режет глаз.
Ksanders Уровень 32
15 октября 2025
скорее дурная, учитывая тот факт, что комментариев по коду нет, только после самого блока с кодом объяснение
akanorei Уровень 1
31 октября 2025
IDE сама предлагает заменить на вызов compute метода данную конструкцию
24 декабря 2025
Просто когда писались эти примеры, метода compute, видимо, ещё не было.
German Malykh Уровень 31
21 сентября 2025
Опечатка Правильно

phonebook.put("Алиса", "+380501112233");
phonebook.put("Боб", "+380671234567");

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

// System.out.println("Телефон Алисы " + phonebook.get("Алиса"));
// Телефон Алисы +380501112233
и т.д