Map中 putIfAbsent、compute、computeIfAbsent、computeIfPresent 学习笔记
putIfAbsent
public class Main {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
map.put("KeyOne", "ValueOne");
map.put("KeyTwo", null);
map.put("KeyThree", "ValueThree");
// Test putIfAbsent
// put 方法是当 Key 存在时,替换旧的 Value,返回旧的 Value;
// putIfAbsent 方法是当 Key 存在时,不进行替换除非 Value 为 null,返回旧的 Value;
// 当 Key 不存在时, 与 put 方法无区别,将键值对存入 Map 中,返回 null
String s1 = map.putIfAbsent("KeyOne", "NewValueOne");
String s2 = map.putIfAbsent("KeyTwo", "NewValueTwo");
String s3 = map.putIfAbsent("KeyFour", "ValueFour");
System.out.println("当 Key 存在,且 Value 不为 null:" + s1);
System.out.println("当 Key 存在,且 Value 为 null:" + s2);
System.out.println("当 Key 不存在:" + s3);
System.out.println(map);
}
}
putIfAbsent:当 Key 存在且 Value 为 null 时,Value会被改变
// HashMap 中重写 Map 接口中的default方法 putIfAbsent
// putVal(hash(key), key, value, true, true) 中倒数第二个参数为 onlyIfAbsent
@Override
public V putIfAbsent(K key, V value) {
return putVal(hash(key), key, value, true, true);
}
// put 方法中 onlyIfAbsent 参数为 false
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
putVal 方法源码:在 onlyIfAbsent 为 false 或者 oldValue 为 null 时替换旧的 Value
compute
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("KeyOne", 1);
// 不管 Key 存在与否,操作完成后存入 map 中
Integer exist = map.compute("KeyOne", (k, v) -> v + 1);
Integer notExist = map.compute("KeyTwo", (k, v) -> {
if(v == null) return 0;
return v + 1;
});
System.out.println(exist);
System.out.println(notExist);
System.out.println(map);
}
}
computeIfAbsent
public class Main {
public static void main(String[] args) {
HashMap<String, List<String>> map = new HashMap<>();
map.put("KeyOne", null);
// Test computeIfAbsent
// 如果 Key 没有映射到一个值或者映射到 null,调用 mappingFunction ,
// 并在 mappingFunction 执行结果不为 null 时,与 Key 关联放入 map
map.computeIfAbsent("KeyOne", k -> new ArrayList<>());
// 以前得这么写 👇
// 注意:不是if(!map.containsKey("KeyOne"))
// if(map.get("KeyOne") == null){
// map.put("KeyOne", new ArrayList<>());
// }
System.out.println(map);
}
}
computeIfPresent
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> map = new HashMap<>();
map.put("KeyOne", 1);
// 对 map 中已经存在的 Key 的 Value 操作
map.computeIfPresent("KeyOne", (k, v) -> v + 1);
System.out.println(map);
}
}