JavaRush /Курсы /Java Syntax Pro /Знакомство с коллекцией HashMap

Знакомство с коллекцией HashMap

Java Syntax Pro
14 уровень , 4 лекция
Открыта

1. Множество пар: ключ-значение.

Множество пар: ключ-значение

В Java есть еще одна интересная коллекция (в широком смысле) — это коллекция Map. Точного перевода ее названия на русский нет: чаще всего ее называют «карта», «словарь» или просто «мапа».

Эта коллекция похожа на коллекцию Set, только хранит не множество элементов, а множество «пар элементов». Каждая пара элементов Map состоит из двух: «ключ» и «значение».

Допустим, вы хотите хранить в программе имена сотрудников компании, их зарплаты или имена ваших коллег и их возраст. Тогда вам бы понадобилась таблица типа такой:

Имя Возраст
Сергей 21
Николай 22
Иван Петрович 48
Анюта ?

В каждой строке тут хранится пара величин. Имя мы будем называть ключом пары, а возраст — значением пары.

Весь набор таких пар и будет называться картойMap.

Ключом пары может быть что угодно, но у некоторых типов карт ключ не может быть null. Ключи должны быть уникальные: одна карта не может содержать два одинаковых ключа.


2. Класс HashMap

Класс HashMap является самой популярной коллекцией из всех карт (Map). С одной стороны, он очень похож на HashSet и имеет все его методы, а с другой — на список (ArrayList), если бы индексами у списка могли быть не числа, а слова.

Создать объект типа HashMap можно с помощью команды вида:

HashMap<TКлюч, TЗначение> имя = new HashMap<TКлюч, TЗначение>();

Где TКлюч — это тип ключей из пары элементов, TЗначение — тип значений в паре элементов, которые будут храниться в коллекции HashMap.

У класса HashMap есть такие методы:

Метод Описание
void put(ТКлюч key, ТЗначение value)
Добавляет в коллекцию пару (key, value)
ТЗначение get(ТКлюч key)
Возвращает значение по ключу.
boolean containsKey(ТКлюч key)
Проверяет наличие ключа в коллекции
boolean containsValue(ТЗначение value)
Проверяет наличие значения в коллекции
ТЗначение remove(ТКлюч key)
Удаляет элемент из коллекции
void clear()
Очищает коллекцию: удаляет все элементы
int size()
Возвращает количество пар элементов в коллекции
Set<ТКлюч> keySet()
Возвращает множество ключей коллекции
Collection<ТЗначение> values()
Возвращает множество элементов коллекции
Set<Map.Entry<TКлюч, TЗначение>> entrySet()
Возвращает все значения коллекции в виде множества (Set) пар (Map.Entry).

Добавление элементов в HashMap

Элементы добавляются в карту сразу парами: для этого используется метод put(). Первым в него передается ключ, вторым — значение.

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Серега", 21);
map.put("Николай", 22);
map.put("Иван Петрович", 48);
map.put("Анюта", null);

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

Такое поведение делает HashMap похожим на массив или список, если бы у них в качестве индексов выступали слова (String), а не числа.

Важно:

В качестве Типа-Ключа и Типа-Значения могут выступать практически любые типы. Есть небольшие дополнительные требования к Типу-Ключу, но о них вы узнаете при детальном изучении коллекций в квесте Java Collections.


14
Задача
Java Syntax Pro, 14 уровень, 4 лекция
Недоступна
Успеваемость студентов
В классе Solution объявлено поле grades типа HashMap, где ключ — имя и фамилия студента, а значение - его средняя оценка. Твоя задача — реализовать метод addStudents, который добавит 5 студентов с их средней оценкой в коллекцию grades. Значения можешь выбрать любые.

3. Подмножества HashMap: множество ключей

Допустим мы хотим просто вывести все элементы HashMap на экран, как нам это сделать? Для этого нужно понять, как пройтись по всем элементам HashMap. Это можно сделать разными способами.

Самый простой способ – использовать цикл по ключам

У элементов класса HashMap нет порядкового номера, поэтому цикл со счетчиком тут не подойдет. Зато мы можем получить множество ключей с помощью метода keySet(), а как пройтись по множеству вы уже знаете:

Код Описание
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Серега", 21);
map.put("Николай", 22);
map.put("Иван Петрович", 48);
map.put("Анюта", null);

for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}






Цикл по всем ключам map

Получаем значение по ключу

Метод keySet() возвращает множество ключей. Можно использовать это множество двумя способами:

Компактная запись Длинная запись
for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}
Set<String> keys = map.keySet();

for (String key: keys)
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}

14
Задача
Java Syntax Pro, 14 уровень, 4 лекция
Недоступна
Успеваемость студентов-2
В классе Solution объявлено поле grades типа HashMap, где ключ — имя и фамилия студента, а значение - его средняя оценка. На этот раз твоя задача — реализовать методы: - printStudents, который выводит только имена всех студентов (ключ коллекции); - getAverageMark, который возвращает

4. Использование цикла по парам

Есть и более сложный способ: можно преобразовать Map в множество пар элементов, а потом использовать цикл по элементам множества, как мы уже раньше учили.

В коллекции HashMap есть вспомогательный класс для хранения пары элементов. Выглядит он примерно так:

class Entry<KeyType, ValueType>
{
   private KeyType key;
   private ValueType value;

   public KeyType getKey()
   {
      return this.key;
   }

   public ValueType getValue()
   {
      return this.value;
   }
}

Результат вызова метода entrySet() у объекта типа HashMap<ТКлюч, ТЗначение> будет иметь тип Set<Entry<ТКлюч, ТЗначение>>:

Set<Entry<Ключ, Значение>> имя = map.entrySet();

Тут мы видим сложный тип Set с параметром-значением, а в качестве параметра-значение выступает еще один сложный тип (Entry), так еще и с двумя параметрами.

Новичку очень легко в этом запутаться. Хотя, если разберетесь, сможете писать код вида:

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Серега", 21);
map.put("Николай", 22);
map.put("Иван Петрович", 48);
map.put("Анюта", null);

Set<Map.Entry<String, Integer>> entries = map.entrySet();
for(Map.Entry<String, Integer> pair: entries)
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Хотя этот код можно и немножко упростить:

Во-первых, можно не создавать отдельную переменную для entries, а сразу вызвать метод entrySet() внутри цикла for:

for(Map.Entry<String, Integer> pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Во-вторых, можно воспользоваться недавно появившимся оператором var для автоматического выведения типа пары элементов:

for(var pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Уже неплохо, да?


14
Задача
Java Syntax Pro, 14 уровень, 4 лекция
Недоступна
Успеваемость студентов-3
В классе Solution объявлено поле grades типа HashMap, где ключ — имя и фамилия студента, а значение - его средняя оценка. Попробуем сделать один метод, который будет выводить полную информацию о студентах, используя метод entrySet класса HashMap. Вывод должен быть следующий: [полное

5. Сравнение ArrayList vs HashMap

HashMap сильно напоминает ArrayList, у которого в качестве индексов используются не цифры, а слова (или другой тип ключей).

А если в качестве ключа в HashMap использовать Integer, он становится еще более похожим на ArrayList. Сравните:

Код с ArrayList<String> Код с HashMap<Integer, String>
ArrayList<String> list = new ArrayList<String>();

list.add("Привет");
list.add("Hello");

String s = list.get(0);
list.set(0, s + "!");

for (String item: list)
{
   System.out.println(item);
}
HashMap<Integer, String> map = new HashMap<Integer, String>();

map.put(0, "Привет");
map.put(1, "Hello");

String s = map.get(0);
map.put(0, s + "!");

for (String item: map.values())
{
   System.out.println(item);
}

14
Задача
Java Syntax Pro, 14 уровень, 4 лекция
Недоступна
ArrayList vs HashMap
В классе Solution есть метод getProgrammingLanguages, который возвращает список языков программирования. Тебе нужно переписать этот метод, чтобы он возвращал HashMap. Ключом в этой коллекции будет индекс элемента в ArrayList.
Комментарии (348)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Виктор Ш Уровень 23
1 февраля 2025
Как-то просто я выучил наизусть все синтаксические финты, начиная с разветвлений до массивов. И как-то расслабился )) А тут вот еще нужно фишек подучить. Поэтому волю в кулак и вперед! ))
Victor Уровень 19
25 января 2025
Да, аналогично, задачи решить то решил обезьяньим методом, а вот учить не знаю стоит или нет, может потом как-нибудь усвоится - на практике.
Nikita Sergeevich Уровень 16
21 января 2025
Придется эти темы с Collections дополнительно "курить" на сторонних курсах. Фиг запомнишь этот синтаксис. Как зубрежка.
Roman Sechin Уровень 24
19 января 2025
19-01-2025
Evgeniy Уровень 17
8 января 2025
Полезно ознакомится: 9 главных вопросов о Map в Java И более свежая HashMap в Java
Артем Уровень 20
8 января 2025
Я не пойму, прочитав комментарии создается впечатление,что последнюю задачу "не решал" только я. Как и во многих предыдущих, конкретно в этой задаче я предположил, что нужно просто переписать метод ArrayList в HashMap. А оказалось что ее прям - решают. Еще - многие используют ChatGPT, не понимаю, ведь если ты не хочешь самостоятельно решать задачу, можно всегда посмотреть на правильное решение от разработчиков или я что то не понимаю. Я, судя по всему главный герой фильма "Левиафан" - ничего не понимаю.
Anonymous #3506553 Уровень 16
4 января 2025
Collection Родительский интерфейс всех коллекций. List, Set, Queue Set Интерфейс, который расширяет Collection. Уникальные элементы. HashSet, TreeSet HashSet Класс, реализующий Set. Неупорядоченное множество уникальных элементов. Map Интерфейс для хранения пар ключ → значение. HashMap, TreeMap HashMap Класс, реализующий Map. Хранит пары ключ → значение, быстрый доступ по ключу. entrySet Метод HashMap, возвращающий пары ключ → значение для перебора. Collections Утилитарный класс для работы с коллекциями (сортировка, поиск, заполнение и т.д.). Collections.sort(list) Используй ArrayList для упорядоченных данных. Используй HashSet для уникальных значений. Используй HashMap для данных вида "ключ → значение". entrySet помогает перебирать все пары ключ → значение в HashMap.
Yasin Akhmadov Уровень 17
3 января 2025
Последнее задание больше всех понравилось. Остальные сверху слегка мутные.
Soup🍲 Уровень 15
28 декабря 2024
хз, вообще ничего не понял. Задачи вроде сделал, но обьяснения не нашел хорошего. Рил с list проще было
Faraway_is_close Уровень 22
3 декабря 2024
Не Set<Entry<Ключ, Значение>> имя = map.entrySet(); А Set<Map.Entry<String, Integer>> entries = map.entrySet(); говорит наш любимый ChatGPT.
Yasin Akhmadov Уровень 17
3 января 2025
он прав кста