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和值做修改。