Java 8 Map 中 putIfAbsent 和computeIfAbsent 有什么区别

作者:编程家 分类: java 时间:2025-05-06

Java 8中的Map接口提供了两个方法,putIfAbsent和computeIfAbsent,用于在向Map中插入元素时进行条件判断。这两个方法的作用类似,但有一些区别。

putIfAbsent方法用于向Map中插入键值对,但只有在指定的键不存在时才会执行插入操作。如果指定的键已经存在于Map中,则putIfAbsent方法不会进行任何操作,并返回已存在的值。下面是一个示例代码:

java

Map map = new HashMap<>();

map.put("key1", "value1");

String oldValue = map.putIfAbsent("key1", "value2");

System.out.println(oldValue); // 输出:value1

String newValue = map.putIfAbsent("key2", "value2");

System.out.println(newValue); // 输出:value2

System.out.println(map); // 输出:{key1=value1, key2=value2}

在上面的例子中,我们首先向Map中插入了一个键值对"key1"-"value1"。然后使用putIfAbsent方法尝试插入键值对"key1"-"value2",由于"key1"已经存在于Map中,所以putIfAbsent方法不会执行插入操作,并返回已存在的值"value1"。接着使用putIfAbsent方法插入键值对"key2"-"value2",由于"key2"不存在于Map中,所以putIfAbsent方法会执行插入操作,并返回插入的值"value2"。最后输出Map中的内容,可以看到两个键值对都成功插入。

computeIfAbsent方法也用于向Map中插入键值对,但与putIfAbsent方法不同的是,computeIfAbsent方法允许我们在插入之前对值进行计算。如果指定的键不存在于Map中,computeIfAbsent方法会执行计算操作,并将计算得到的值插入到Map中。下面是一个示例代码:

java

Map map = new HashMap<>();

map.put("key1", 1);

Integer oldValue = map.computeIfAbsent("key1", key -> key.length());

System.out.println(oldValue); // 输出:1

Integer newValue = map.computeIfAbsent("key2", key -> key.length());

System.out.println(newValue); // 输出:4

System.out.println(map); // 输出:{key1=1, key2=4}

在上面的例子中,我们首先向Map中插入了一个键值对"key1"-1。然后使用computeIfAbsent方法尝试插入键值对"key1"-"value2",由于"key1"已经存在于Map中,所以computeIfAbsent方法不会执行插入操作,并返回已存在的值1。接着使用computeIfAbsent方法插入键值对"key2"-"value2",由于"key2"不存在于Map中,所以computeIfAbsent方法会执行计算操作,计算得到的值是"key2"的长度4,并将键值对"key2"-4插入到Map中。最后输出Map中的内容,可以看到两个键值对都成功插入。

putIfAbsent和computeIfAbsent方法都是用于向Map中插入键值对的方法,但putIfAbsent方法只在指定的键不存在时执行插入操作,而computeIfAbsent方法允许我们在插入之前对值进行计算。根据具体的需求选择合适的方法可以提高代码的清晰度和执行效率。