Библиотека джависта | Java, Spring, Maven, Hibernate
23.4K subscribers
2.21K photos
46 videos
45 files
3.12K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://t.iss.one/proglibrary/9197

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Download Telegram
👀 Внутреннее устройство Map.computeIfAbsent()

computeIfAbsent() — это не просто «get или put». Это атомарная операция с ленивым вычислением, которая решает классическую проблему check-then-act в многопоточном коде.

📦 Что такое computeIfAbsent()

Поведение

1. Если ключ существует и value != null → вернуть value
2. Если ключа нет или value == null → вызвать mappingFunction
3. Результат функции put в map
4. Вернуть computed value

Классический use case:

//  Старый способ — race condition!
if (!map.containsKey(key)) {
map.put(key, expensiveOperation());
}

// Новый способ — атомарно
map.computeIfAbsent(key, k -> expensiveOperation());


🔍 Упрощённый код из JDK:

public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
if (mappingFunction == null)
throw new NullPointerException();

int hash = hash(key);
Node<K,V>[] tab = table;
Node<K,V> first = tab[index];

// Поиск существующего entry
if (first != null) {
Node<K,V> e = first;
do {
if (e.hash == hash &&
Objects.equals(key, e.key)) {
V v = e.value;
if (v != null) {
return v; // Найден, не вызываем функцию!
}
}
} while ((e = e.next) != null);
}

// Ключа нет — вызов mappingFunction
V newValue = mappingFunction.apply(key);

if (newValue != null) {
putVal(hash, key, newValue, true, true);
}

return newValue;
}


📊 Performance

Benchmark: 1M операций
// Старый способ: containsKey + put
if (!map.containsKey(key)) {
map.put(key, new ArrayList<>());
}
// Time: ~45ms, 2 hash lookups

// computeIfAbsent
map.computeIfAbsent(key, k -> new ArrayList<>());
// Time: ~30ms, 1 hash lookup

computeIfAbsent() на 33% быстрее!


Делайте

— Используйте для lazy initialization
— Используйте ConcurrentHashMap для thread-safety
— Держите mappingFunction быстрым и простым

Не делайте

— Не вызывайте computeIfAbsent рекурсивно на том же ключе
— Не модифицируйте map внутри mappingFunction
— Не возвращайте null если хотите кэшировать отсутствие
— Не используйте для побочных эффектов (только для вычисления value)

🔗 Документация

Ставьте 🔥, если интересны другие Map методы!

Бонусы для подписчиков:
Скидка 40% на все курсы Академии
Розыгрыш Apple MacBook
Бесплатный тест на знание математики

🐸 Библиотека джависта

#CoreJava
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍42👏1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Хочешь строить свои AI-модели, а не просто запускать чужие?

Proglib.academy открывает курс «Математика для разработки AI-моделей» — программу, которая превращает понимание ML из «черного ящика» в осознанную инженерную работу.

📌 Почему без математики в AI никуда:

→ Чтобы пройти собеседование. Это первый фильтр: линал, матстат, оптимизация — спрашивают везде.
→ Чтобы понимать процесс изнутри. Инженер AI должен понимать, почему и как работает модель, а не просто жать fit().

🎓 Что будет на курсе:

→ 3 практических задания на Python + финальный проект с разбором от специалистов;
→ программа обновлена в ноябре 2025;
→ за 2 месяца пройдёшь весь фундамент, нужный для работы с моделями;
→ преподаватели — гуру математики, методисты и исследователи из ВШЭ и индустрии.

🎁 Бонусы ноября:

— 40% скидка;
— получаешь курс «Школьная математика» в подарок;
— короткий тест и узнать свой уровень.

🔗 Подробнее о курсе