📅  最后修改于: 2023-12-03 14:42:46.165000             🧑  作者: Mango
ConcurrentHashMap computeIfAbsent()
方法及示例ConcurrentHashMap
是 Java
中线程安全的哈希表,它提供了一些线程安全的方法来操作哈希表。其中一个方法是 computeIfAbsent()
,它的作用是在哈希表中根据指定的键进行查找,如果存在则返回值,否则根据指定的函数创建一个新的值,并将它与键关联。
computeIfAbsent()
方法的语法default V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)
参数说明:
key
:要查找的键。mappingFunction
:用于创建新值的函数。如果在哈希表中不存在该键,则调用该函数来创建一个新值。返回值:
该方法返回与指定键关联的值。如果在哈希表中不存在该键,则将由指定函数创建一个新值,并将它与键关联,然后返回它。
computeIfAbsent()
方法的示例下面是一个使用 computeIfAbsent()
方法创建线程安全的计数器的示例:
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
public class Counter {
private final ConcurrentHashMap<String, Integer> counterMap = new ConcurrentHashMap<>();
public int count(String word) {
// 使用 computeIfAbsent() 方法创建线程安全的计数器
return counterMap.computeIfAbsent(word, new Function<>() {
@Override
public Integer apply(String key) {
return 0;
}
}) + 1;
}
}
在上面的示例中,我们定义了一个 Counter
类,它使用 ConcurrentHashMap
中的 computeIfAbsent()
方法创建线程安全的计数器。每次调用 count()
方法时,它将对指定单词的计数器进行递增。如果指定单词的计数器不存在,则使用 computeIfAbsent()
方法创建一个初始值为0的计数器。
下面是一个测试代码的示例:
public class Main {
public static void main(String[] args) {
Counter counter = new Counter();
System.out.println(counter.count("hello")); // 输出 1
System.out.println(counter.count("world")); // 输出 1
System.out.println(counter.count("world")); // 输出 2
}
}
在上面的代码中,我们创建了一个 Counter
实例,并调用其 count()
方法来统计单词的出现次数。第一个调用 count("hello")
将计数器 hello
的值从0递增到1,第二个调用 count("world")
将计数器 world
的值从0递增到1,第三个调用 count("world")
将计数器 world
的值从1递增到2。
computeIfAbsent()
方法是 ConcurrentHashMap
中提供的一个用于创建线程安全计数器等类的强大方法。它能够在哈希表中创建新的键值对,并且在多线程环境下保证线程安全。在开发过程中,我们应该优先选择使用 ConcurrentHashMap
来保证线程安全。