📜  Java中的 ConcurrentHashMap computeIfAbsent() 方法及示例(1)

📅  最后修改于: 2023-12-03 14:42:46.165000             🧑  作者: Mango

Java中的 ConcurrentHashMap computeIfAbsent() 方法及示例

ConcurrentHashMapJava 中线程安全的哈希表,它提供了一些线程安全的方法来操作哈希表。其中一个方法是 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 来保证线程安全。