putIfAbsent()
和 computeIfAbsent()
都是 Map
接口中的方法,用来在 Map
中放入元素,避免重复插入。但它们的行为有所不同,主要体现在插入时是否执行计算操作。
1. putIfAbsent(K key, V value)
- 功能:如果指定的
key
不存在于Map
中,则将key
和value
添加到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()
允许在值不存在时进行计算插入。