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 подскажет развёрнутый ответ в реальном времени.