TGViewer
Java Portal | Программирование Java Portal | Программирование @java_iibrary · 11.6K subscribers
Post #2163 2.19K
Продвинутый Map в Java (надо знать)

Если ты хоть раз делал Map<String, List<String>>, этот пост для тебя.

Признайся, все когда-то писали так:

Map<String, List<String>> userTags = new HashMap<>();
userTags.computeIfAbsent("user123", k -> new ArrayList<>()).add("premium");
userTags.computeIfAbsent("user123", k -> new ArrayList<>()).add("verified");


Или вообще вот так:

if (!userTags.containsKey("user123")) {
userTags.put("user123", new ArrayList<>());
}
userTags.get("user123").add("premium");


==> В Apache Commons Collections уже давно есть готовая штука: MultiValuedMap.

Что это такое

MultiValuedMap<K, V> это структура данных, которая позволяет хранить несколько значений на один ключ. По сути это Map<K, Collection<V>>, но с нормальным, удобным API.

MultiValuedMap<String, String> userTags = new ArrayListValuedHashMap<>();

userTags.put("user123", "premium");
userTags.put("user123", "verified");
userTags.put("user123", "early-adopter");

// Забрать все теги сразу
Collection<String> tags = userTags.get("user123");
// [premium, verified, early-adopter]


Никаких computeIfAbsent, никаких проверок на null. Просто работает.

Что умеет

- Добавление без боли:

multiMap.put("key", "value1");
multiMap.put("key", "value2"); // не затирает предыдущее значение


- Массовые операции:

multiMap.putAll("user456", Arrays.asList("admin", "moderator"));


- Проверка существования конкретной пары:

multiMap.containsMapping("user123", "premium"); // true/false


- Удаление конкретного значения у ключа:

multiMap.removeMapping("user123", "premium");


- Получить вообще все значения:

Collection<String> allTags = multiMap.values();
// все значения со всех ключей


Реализации

- ArrayListValuedHashMap<K, V> — значения хранятся в ArrayList, порядок сохраняется, дубликаты возможны
- HashSetValuedHashMap<K, V> — значения хранятся в HashSet, без дублей

👉 Java Portal
  • ❤ 8
  • 🔥 5
  • 👀 5
  • 👍 3
  • 🤔 1
More from @java_iibrary
  1. Sep 26, 2026Java: используйте Deque вместо Stack для работы по принципу LIFO («последним пришёл — перв…
  2. Sep 25, 2026Каждый Java-разработчик использует HashMap. Но задумывались ли вы… Почему его ёмкость всег…
  3. Sep 25, 2026Бесплатные ресурсы для изучения Java Конспект Effective Java — HugoMatilla/Effective-JAVA-…
  4. Sep 24, 2026Многие разработчики используют Java каждый день. Но мало кто знает, почему он стал одним и…
  5. Sep 24, 2026Java-разработчики, в чём разница между volatile и synchronized? Многие используют их. Но в…
  6. Sep 23, 2026Готовимся к System Design интервью уровня Middle и Senior Полезный конспект по проектирова…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →