HashMap: словарь в Java
HashMap — словарь: хранит пары «ключ — значение» и быстро находит значение по ключу. Например, товар → цена, слово → сколько раз встретилось, логин → пользователь. Ключи не повторяются.
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
2Map<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() | все пары — для обхода циклом |
Подсчёт слов и обход всех пар
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
пёс — 2count.getOrDefault(word, 0) + 1 — «сколько было, плюс один». entrySet() отдаёт все пары, у каждой есть getKey() и getValue(). Ту же строку подсчёта можно записать короче: count.merge(word, 1, Integer::sum) — положить 1, а если ключ уже есть, сложить старое значение с единицей (Integer::sum — ссылка на готовый метод сложения).
Здесь взят TreeMap — он хранит ключи по порядку (строки — по алфавиту), поэтому вывод предсказуем.
Порядок ключей
HashMap— порядок обхода не гарантирован и может отличаться от порядка добавления. Самый быстрый вариант, когда порядок не важен.LinkedHashMap— помнит порядок добавления.TreeMap— сортирует ключи.
Методы у всех трёх одинаковые, меняется только new …<>().
Подводные камни
int x = map.get(key);при отсутствии ключа даётNullPointerException:nullнельзя превратить вint. БеритеgetOrDefaultили сначала проверьтеcontainsKey.- Ключи — свои объекты. Если ключ — объект своего класса, в классе должны быть переопределены
equalsиhashCode, иначе одинаковые по смыслу ключи будут считаться разными. - Изменение во время обхода. Удалять пары в цикле for-each по
entrySet()нельзя —ConcurrentModificationException. Удаление по условию:map.entrySet().removeIf(e -> e.getValue() == 0). - Только наличие без значений — для этого есть
HashSet:add,contains,remove.