putIfAbsent是HashMap中用于键不存在时插入值的原子方法,返回null(插入成功)或已有值(未插入),避免重复计算和手动检查,适用于懒初始化、唯一映射等场景。

putIfAbsent 是 HashMap 中一个非常实用的方法,能帮你避免手动检查 key 是否存在、再决定是否插入的冗余逻辑,让代码更简洁、线程安全(在单个 map 操作层面)且不易出错。
核心作用:只在 key 不存在时才存入值
它等价于下面这段“先查后放”的手动逻辑:
if (!map.containsKey(key)) {
map.put(key, value);
}
但 putIfAbsent 用一行就搞定,而且是原子操作——即使多个线程同时调用,也不会出现重复插入或覆盖问题(注意:它不保证整个业务逻辑线程安全,仅保证这一步操作的原子性)。
基本用法:传入 key 和 value,返回旧值或 null
方法签名是:V putIfAbsent(K key, V value)
- 如果 key 不存在,插入
(key, value),返回null - 如果 key 已存在,不修改 map,返回当前已有的 value
例如:
Map<string string> map = new HashMap();
String old = map.putIfAbsent("name", "Alice"); // 返回 null
String old2 = map.putIfAbsent("name", "Bob"); // 不插入,返回 "Alice"
System.out.println(map); // {name=Alice}
</string>
常见简化场景
- 懒初始化默认值:比如缓存中某个 key 对应的对象需要首次访问时创建
- 避免重复计算:value 构造开销大(如 new 复杂对象、解析 JSON),只在真需要时才执行
- 构建唯一映射:确保某个 key 只绑定第一个遇到的 value,后续忽略
- 替代 computeIfAbsent 的轻量选择:当 value 不依赖 key 计算,且无需 lambda 开销时,putIfAbsent 更直接
和 computeIfAbsent 的区别要点
别混淆这两个方法:
- putIfAbsent:直接传 value,适合 value 已就绪或构造成本低
- computeIfAbsent:传一个 Function,只在 key 不存在时才调用函数生成 value,适合 value 需按需计算、可能较重的场景
如果你写的是 map.putIfAbsent(key, expensiveMethod()),那 不管 key 是否存在,expensiveMethod() 都会被执行——这时就得换成 computeIfAbsent。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











