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() 允许在值不存在时进行计算插入。