Глиф Учебники

HashMap: словарь в Java

Справочник · Java · 1 минута чтения

HashMap — словарь: хранит пары «ключ — значение» и быстро находит значение по ключу. Например, товар → цена, слово → сколько раз встретилось, логин → пользователь. Ключи не повторяются.

Java
import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> prices = new HashMap<>();
        prices.put("хлеб", 2);
        prices.put("молоко", 3);
        prices.put("хлеб", 4);
        System.out.println(prices.get("хлеб"));
        System.out.println(prices.get("сыр"));
        System.out.println(prices.getOrDefault("сыр", 0));
        System.out.println(prices.containsKey("молоко"));
        System.out.println(prices.size());
    }
}
Вывод
4
null
0
true
2

Map<String, Integer> — ключи-строки и значения-числа. Второй put с ключом «хлеб» не добавил новую пару, а заменил значение: теперь хлеб стоит 4. get для ключа, которого нет, возвращает null, а getOrDefault — значение, указанное вторым аргументом.

Основные методы

МетодЧто делает
put(k, v)кладёт значение по ключу, старое заменяется
get(k)значение по ключу или null
getOrDefault(k, d)значение или d, если ключа нет
containsKey(k)есть ли ключ
remove(k)удаляет пару
size()число пар
keySet(), values()все ключи, все значения
entrySet()все пары — для обхода циклом

Подсчёт слов и обход всех пар

Java
import java.util.Map;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        String text = "кот пёс кот мышь кот пёс";
        Map<String, Integer> count = new TreeMap<>();
        for (String word : text.split(" ")) {
            count.put(word, count.getOrDefault(word, 0) + 1);
        }
        System.out.println(count);
        for (Map.Entry<String, Integer> e : count.entrySet()) {
            System.out.println(e.getKey() + " — " + e.getValue());
        }
    }
}
Вывод
{кот=3, мышь=1, пёс=2}
кот — 3
мышь — 1
пёс — 2

count.getOrDefault(word, 0) + 1 — «сколько было, плюс один». entrySet() отдаёт все пары, у каждой есть getKey() и getValue(). Ту же строку подсчёта можно записать короче: count.merge(word, 1, Integer::sum) — положить 1, а если ключ уже есть, сложить старое значение с единицей (Integer::sum — ссылка на готовый метод сложения).

Здесь взят TreeMap — он хранит ключи по порядку (строки — по алфавиту), поэтому вывод предсказуем.

Порядок ключей

Методы у всех трёх одинаковые, меняется только new …<>().

Подводные камни