1、putIfAbsent使用
之前的put方法,只要key存在,value值就会被覆盖,注意put方法返回的是put之前的值,如果无put之前的值,则返回null。putIfAbsent方法,只有在key不存在或者key对应value为null的时候,value值才会被覆盖。
putIfAbsent源代码如下:
default V putIfAbsent(K key, V value) {
V v = get(key);
if (v == null) {
v = put(key, value);
}
return v;
}
使用put()方法实现相同效果,如下代码:
if(map.containsKey("kk")&&map.get("kk")!=null) {
map.put("kk", "vv");
}
使用场景:如果我们要变更某个key的值,我们又不知道key是否存在的情况下,而又不需要新增key的情况使用。
2、computeIfAbsent的使用
简单来说,如果map里没有这个key,那么就按照后面的这个function添加对应的key和value
如果要是有这个key,那么就不添加。
源代码如下:
//1. default
default V computeIfAbsent(K key,
Function<? super K, ? extends V> mappingFunction) {//第一个参数为Map的key,第二个参数是一个函数接口
//2. requireNonNull
Objects.requireNonNull(mappingFunction);
V v;
// 将第一个参数作为key,获取value,并将其赋给v ,判断是否为null
if ((v = get(key)) == null) {
//若v 为null,则创建一个新的值newValue
V newValue;
// 3. mappingFunction.apply
if ((newValue = mappingFunction.apply(key)) != null) {
put(key, newValue);
return newValue;
}
}
return v;
}
使用示例代码:
import java.util.*;
public class GFG {
// Main method
public static void main(String[] args)
{
Map<String, Integer> map = new Hashtable<>();
map.put("Pen", 10);
map.put("Book", 500);
map.put("Clothes", 400);
map.put("Mobile", 5000);
System.out.println("hashTable: "
+ map.toString());
// 为缺少的新key提供值
// 使用computeIfAbsent方法
map.computeIfAbsent("newPen", k -> 600);
map.computeIfAbsent("newBook", k -> 800);
System.out.println("new hashTable: "
+ map);
}
}
输出结果:
hashTable:{Book = 500,Mobile = 5000,Pen = 10,Clothes = 400}
new hashTable:{newPen = 600,Book = 500,newBook = 800,Mobile = 5000,Pen = 10,Clothes = 400}
使用场景:我们不知道key是否存在,只是新增key及对应的值,不对之前的key和值做修改。