Java Map.putIfAbsent方法详解

Java Map.putIfAbsent方法详解

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方法的语法、用法和示例代码。还提到了多线程环境下使用该方法的场景,以确保只有一个线程能够成功添加键值对。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程