putIfAbsent和computeIfAbsent
时间: 2023-03-14 10:32:44 浏览: 72
这两个方法都是Java 8中的Map接口的新增方法,它们都可以在Map中添加新的键值对,但是它们之间有一些不同:putIfAbsent会检查Map中是否已存在指定的键,如果不存在,则添加新的键值对;而computeIfAbsent会检查Map中是否存在指定的键,如果不存在,则使用给定的Function来计算新的值,并将其添加到Map中。
相关问题
computeifabsent和putifabsent
`computeIfAbsent`和`putIfAbsent`都是Map接口中的方法,用于在Map中添加键值对。它们的区别在于,当Map中已经存在指定的键时,`putIfAbsent`方法不会进行任何操作,而`computeIfAbsent`方法会根据指定的函数计算一个新的值并将其与键关联。
下面是两个方法的示例代码:
1. `putIfAbsent`方法示例:
```java
Map<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.putIfAbsent("banana", 2);
map.putIfAbsent("apple", 3);
System.out.println(map); // 输出:{apple=1, banana=2}
```
2. `computeIfAbsent`方法示例:
```java
Map<String, List<String>> map = new HashMap<>();
map.computeIfAbsent("fruits", k -> new ArrayList<>()).add("apple");
map.computeIfAbsent("fruits", k -> new ArrayList<>()).add("banana");
System.out.println(map); // 输出:{fruits=[apple, banana]}
```
在第一个示例中,`putIfAbsent`方法只在Map中不存在"banana"键时才将其添加到Map中,而对于已经存在的"apple"键,不会进行任何操作。
在第二个示例中,`computeIfAbsent`方法会根据"fruits"键是否存在来判断是否需要计算一个新的值。由于"fruits"键在Map中不存在,因此会根据指定的函数创建一个新的ArrayList,并将其与"fruits"键关联。接着,"apple"和"banana"元素会被添加到这个ArrayList中。
ConcurrentHashMap的putifabsent和
ConcurrentHashMap是Java中的一个线程安全的哈希表实现,它支持高并发的读写操作。putIfAbsent()和computeIfAbsent()是ConcurrentHashMap中的两个方法,用于在插入元素时进行条件判断。
1. putIfAbsent(key, value)方法会尝试将指定的键值对插入到ConcurrentHashMap中,但只有在该键不存在时才会插入成功。如果该键已经存在,则不会进行插入操作,并返回已存在的值。这个方法可以用于实现一些缓存逻辑,避免重复计算或者重复获取数据。
2. computeIfAbsent(key, mappingFunction)方法也是尝试将指定的键值对插入到ConcurrentHashMap中,但与putIfAbsent()不同的是,如果该键已经存在,则会执行mappingFunction函数来计算新的值,并将新的值更新到ConcurrentHashMap中。这个方法可以用于实现一些延迟加载的逻辑,只有在需要时才进行计算或者获取数据。
需要注意的是,这两个方法都是原子操作,保证了线程安全性。在高并发场景下,使用ConcurrentHashMap的putIfAbsent()和computeIfAbsent()方法可以有效地避免竞态条件和线程安全问题。