Java Map.putIfAbsent方法详解
1. 简介
在Java的集合类中,我们通常会使用Map
来保存一组键值对数据。Map
中的键是唯一的,而值可以有重复。在进行键值对的添加时,我们可以使用put
方法,但是如果我们想要只在键不存在时才添加键值对,就可以使用putIfAbsent
方法。
putIfAbsent
方法是在Java 8中添加到Map
接口中的一个方法,用于将指定的键和值添加到Map
中,如果该键不存在。如果键已经存在,则返回已存在的值,不对已存在的键做任何修改。
2. 语法
putIfAbsent
方法的语法如下:
V putIfAbsent(K key, V value)
key
:要添加到Map
中的键value
:要添加到Map
中的值
3. 示例
在下面的示例中,我们将演示putIfAbsent
方法的用法。我们首先创建一个HashMap
对象,并向其添加几个键值对。然后,我们使用putIfAbsent
方法添加一个新的键值对,这个新的键不存在于Map
中。我们还尝试添加一个已经存在的键,看看返回的值。
import java.util.HashMap;
import java.util.Map;
public class MapExample {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
// 添加键值对
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
// 添加一个不存在的键
String value1 = map.putIfAbsent("key4", "value4");
System.out.println("Value of key4=" + value1); // Output: Value of key4=null
// 添加一个已经存在的键
String value2 = map.putIfAbsent("key1", "newValue");
System.out.println("Value of key1=" + value2); // Output: Value of key1=value1
}
}
以上代码的输出如下:
Value of key4=null
Value of key1=value1
从输出结果可以看出,当向Map中添加不存在的键时,返回的值为null
,而当添加已经存在的键时,返回的值为已存在的值。
4. 使用场景
putIfAbsent
方法在多线程环境中特别有用,可以确保在并发操作中只有一个线程能够成功添加键值对。
考虑以下场景:多个线程正在同时尝试向同一个Map
中添加一个新的键值对,但只有一个线程能够成功地添加它。在这种情况下,我们可以使用putIfAbsent
方法来保证只有一个线程能够添加键值对,其他线程将得到已存在的值。
让我们看一个示例,演示了多个线程同时使用putIfAbsent
方法:
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class MapExample {
public static void main(String[] args) throws InterruptedException {
Map<String, Integer> map = new ConcurrentHashMap<>();
// 创建两个线程尝试同时添加相同的键值对
Thread thread1 = new Thread(() -> {
Integer value1 = map.putIfAbsent("key", 1);
System.out.println("Thread1 - Value of key=" + value1); // Output: Thread1 - Value of key=null
});
Thread thread2 = new Thread(() -> {
Integer value2 = map.putIfAbsent("key", 2);
System.out.println("Thread2 - Value of key=" + value2); // Output: Thread2 - Value of key=1
});
// 启动线程
thread1.start();
thread2.start();
// 等待线程完成
thread1.join();
thread2.join();
// 输出Map中的值
System.out.println("Map: " + map); // Output: Map: {key=1}
}
}
以上代码的输出如下:
Thread1 - Value of key=null
Thread2 - Value of key=1
Map: {key=1}
从输出结果可以看出,尽管两个线程同时尝试向Map
中添加键值对,但只有一个线程成功添加,并且返回的值为null
。另一个线程返回已存在的值。
5. 总结
putIfAbsent
方法是Java集合类中的一个有用的方法,用于将键值对添加到Map
中,前提是该键在Map
中不存在。该方法可以避免不必要的键重复。
本文介绍了putIfAbsent
方法的语法、用法和示例代码。还提到了多线程环境下使用该方法的场景,以确保只有一个线程能够成功添加键值对。