HashMap

Класс java.util.HashMap — это коллекция пар «ключ — значение» (key-value). По ключу можно очень быстро получить или изменить значение, не перебирая всю коллекцию. Это аналог словаря (dict) в Python или объектов в JavaScript.

HashMap<K, V> параметризуется двумя типами: K — тип ключа, V — тип значения. Ключи в HashMap уникальны: если положить новое значение по существующему ключу, старое будет заменено.

Внутри HashMap устроен как массив «корзин» (buckets). При добавлении пары вычисляется хеш-код ключа, и пара кладётся в соответствующую корзину. Поэтому операции put, get и containsKey в среднем работают за O(1).

Порядок хранения элементов в HashMap не гарантируется и может меняться. Если нужен порядок добавления — используйте LinkedHashMap.

Зачем нужен

  • быстро искать значение по уникальному ключу (имя → возраст, артикул → цена);

  • подсчитывать частоту вхождений (символ → сколько раз встретился);

  • хранить настройки в формате «параметр → значение»;

  • кешировать результаты по идентификатору.

Способы создания

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

HashMap<String, Integer> a = new HashMap<>();
HashMap<String, Integer> b = new HashMap<>(64);   // начальная ёмкость
Map<String, Integer> c = Map.of("один", 1, "два", 2); // неизменяемая Map

Популярные методы

Метод

Назначение

put(K key, V value)

добавить или заменить значение по ключу

get(Object key)

получить значение по ключу или null

getOrDefault(key, def)

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

remove(Object key)

удалить пару по ключу

containsKey(Object key)

есть ли такой ключ

containsValue(Object v)

есть ли такое значение

size()

количество пар

isEmpty()

пуста ли карта

keySet()

множество всех ключей

values()

коллекция всех значений

entrySet()

множество пар Entry

clear()

удалить все элементы

Примеры

Пример 1. Создание и добавление

import java.util.HashMap;

public class Demo1 {
    public static void main(String[] args) {
        HashMap<String, Integer> ages = new HashMap<>();
        ages.put("Айдар", 12);
        ages.put("Беку", 14);
        ages.put("Дина", 11);

        System.out.println("Возраст Беку: " + ages.get("Беку"));
        System.out.println("Всего записей: " + ages.size());
    }
}

Вывод:

Возраст Беку: 14
Всего записей: 3

Пример 2. Замена значения по существующему ключу

import java.util.HashMap;

public class Demo2 {
    public static void main(String[] args) {
        HashMap<String, Integer> prices = new HashMap<>();
        prices.put("ручка", 100);
        prices.put("тетрадь", 250);
        prices.put("ручка", 120);
        System.out.println(prices.get("ручка"));
        System.out.println("Размер: " + prices.size());
    }
}

Вывод:

120
Размер: 2

Пример 3. Проверка наличия ключа

import java.util.HashMap;

public class Demo3 {
    public static void main(String[] args) {
        HashMap<String, String> caps = new HashMap<>();
        caps.put("Казахстан", "Астана");
        caps.put("Россия", "Москва");

        System.out.println(caps.containsKey("Казахстан"));
        System.out.println(caps.containsKey("Япония"));
        System.out.println(caps.getOrDefault("Япония", "неизвестно"));
    }
}

Вывод:

true
false
неизвестно

Пример 4. Удаление по ключу

import java.util.HashMap;

public class Demo4 {
    public static void main(String[] args) {
        HashMap<String, Integer> stock = new HashMap<>();
        stock.put("Arduino", 20);
        stock.put("ESP32", 15);
        stock.put("Raspberry", 5);

        stock.remove("Raspberry");
        System.out.println(stock.containsKey("Raspberry"));
        System.out.println("Осталось: " + stock.size());
    }
}

Вывод:

false
Осталось: 2

Пример 5. Перебор через entrySet

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Demo5 {
    public static void main(String[] args) {
        HashMap<String, Integer> scores = new HashMap<>();
        scores.put("Айдар", 85);
        scores.put("Беку", 92);
        scores.put("Дина", 78);

        // TreeMap для стабильного порядка вывода (по ключу)
        for (Map.Entry<String, Integer> e : new TreeMap<>(scores).entrySet()) {
            System.out.println(e.getKey() + " = " + e.getValue());
        }
    }
}

Вывод:

Айдар = 85
Беку = 92
Дина = 78

Пример 6. Подсчёт частоты символов

import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;

public class Demo6 {
    public static void main(String[] args) {
        String text = "abracadabra";
        HashMap<Character, Integer> freq = new HashMap<>();
        for (char c : text.toCharArray()) {
            freq.put(c, freq.getOrDefault(c, 0) + 1);
        }
        for (Map.Entry<Character, Integer> e : new TreeMap<>(freq).entrySet()) {
            System.out.println(e.getKey() + ": " + e.getValue());
        }
    }
}

Вывод:

a: 5
b: 2
c: 1
d: 1
r: 2

Пример 7. Получение всех ключей и значений

import java.util.HashMap;
import java.util.TreeSet;

public class Demo7 {
    public static void main(String[] args) {
        HashMap<String, Integer> m = new HashMap<>();
        m.put("a", 1);
        m.put("b", 2);
        m.put("c", 3);

        System.out.println("Ключи: " + new TreeSet<>(m.keySet()));
        int sum = 0;
        for (int v : m.values()) sum += v;
        System.out.println("Сумма значений: " + sum);
    }
}

Вывод:

Ключи: [a, b, c]
Сумма значений: 6

Пример 8. Очистка карты

import java.util.HashMap;

public class Demo8 {
    public static void main(String[] args) {
        HashMap<Integer, String> m = new HashMap<>();
        m.put(1, "один");
        m.put(2, "два");

        System.out.println("До: size=" + m.size() + ", empty=" + m.isEmpty());
        m.clear();
        System.out.println("После: size=" + m.size() + ", empty=" + m.isEmpty());
    }
}

Вывод:

До: size=2, empty=false
После: size=0, empty=true

См. также

Примечание

Лицензия и источники

Техническое описание класса адаптировано из официальной Java API Documentation (https://docs.oracle.com/en/java/javase/), Oracle Free Documentation License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.