Mediummap
Что такое Map.computeIfAbsent?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
computeIfAbsent(key, fn) — если key нет (или null), вычисляет value через fn и кладёт в map. Возвращает текущее value. Атомарно (в ConcurrentHashMap — с proper synchronization).
// Pattern multimap без ручной проверки
Map<String, List<Integer>> m = new HashMap<>();
m.computeIfAbsent("key", k -> new ArrayList<>()).add(42);
// Счётчик слов
Map<String, Integer> counts = new HashMap<>();
counts.merge(word, 1, Integer::sum); // 1 если новый, иначе +1
// Cache
cache.compute(key, (k, v) -> v != null ? v : loadFromDb(k));- Родственные:
computeIfPresent,compute,merge; merge(key, value, remappingFn)— комбинирует old + new;- Если fn вернёт null — запись удаляется;
- fn не должен сам модифицировать map (ConcurrentModificationException);
- Атомарные:
putIfAbsent,replace(key, value),replace(key, oldV, newV).
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.