putIfAbsent()computeIfAbsent() 都是 Map 接口中的方法,用来在 Map 中放入元素,避免重复插入。但它们的行为有所不同,主要体现在插入时是否执行计算操作。

1. putIfAbsent(K key, V value)

  • 功能:如果指定的 key 不存在于 Map 中,则将 keyvalue 添加到 Map 中。如果 key 已经存在,则不做任何操作。
  • 返回值:如果 key 不存在,返回 null(表示插入了新的键值对);如果 key 已经存在,返回现有的值。

示例

Map<String, String> map = new HashMap<>();
map.putIfAbsent("key1", "value1"); // key1 不存在,插入
map.putIfAbsent("key1", "value2"); // key1 已存在,不插入
System.out.println(map); // 输出: {key1=value1}

2. computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)

  • 功能:如果 Map 中没有指定的 key,则通过 mappingFunction 计算出一个值并插入该 key。如果 key 已经存在,返回现有的值,并且不会调用 mappingFunction
  • 返回值:无论 key 是否存在,都会返回与 key 相关联的值。如果 key 不存在并且 mappingFunction 被调用,则返回通过该函数计算出的值。

示例

Map<String, String> map = new HashMap<>();
map.computeIfAbsent("key1", key -> "value" + key); // key1 不存在,计算并插入
map.computeIfAbsent("key1", key -> "newValue"); // key1 已存在,不会更新
System.out.println(map); // 输出: {key1=valuekey1}

区别总结:

  • putIfAbsent() 只是简单地检查是否存在该 key,如果不存在则插入给定的 value
  • computeIfAbsent() 在插入值之前,会根据传入的 mappingFunction 对值进行计算,即如果 key 不存在时,它会生成一个值。对于已存在的 key,不会进行计算。

换句话说,putIfAbsent() 仅插入固定的值,而 computeIfAbsent() 允许在值不存在时进行计算插入。

最后修改:2025 年 01 月 15 日
如果觉得我的文章对你有用,请随意赞赏