java.util.Map中put,computeIfAbsent与putIfAbsent区别

computeIfAbsent和putIfAbsent区别是三点:

1、当Key存在的时候,如果Value获取比较昂贵的话,putIfAbsent就白白浪费时间在获取这个昂贵的Value上(这个点特别注意)

2、Key不存在的时候,putIfAbsent返回null,小心空指针,而computeIfAbsent返回计算后的值

3、当Key不存在的时候,putIfAbsent允许put null进去,而computeIfAbsent不能,之后进行containsKey查询是有区别的(当然了,此条针对HashMap,ConcurrentHashMap不允许put null value进去)

4、computeIfAbsent的value是接受一个Function,而putIfAbsent是是接受一个具体的value,所以computeIfAbsent的使用应该是非常灵活的

下面代码演示:

public V putIfAbsent(K key, V value)

        ConcurrentHashMap map = new ConcurrentHashMap<>();
        System.out.println("put:" + map.putIfAbsent("hello", "123"));
        System.out.println(map.get("hello"));
        System.out.println("put:" + map.putIfAbsent("hello", "456"));
        System.out.println(map.get("hello"));

输入如下:

put:null
123
put:123
123

putIfAbsent会返回之前的值,如果之前不存在,则返回null;而且put一个存在的key时,并不会覆盖掉之前的key。

public V computeIfAbsent(K key, Function mappingFunction)

        ConcurrentHashMap map = new ConcurrentHashMap<>();
        System.out.println("put:" + map.computeIfAbsent("world", s -> "java"));
        System.out.println(map.get("world"));
        System.out.println("put:" + map.computeIfAbsent("world", s -> "php"));
        System.out.println(map.get("world"));

输出如下:

put:java
java
put:java
java

computeIfAbsent会返回本次计算的值,同时如果put的也是一个存在的key时,也不会覆盖掉之前的key。

public V put(K key, V value)

        ConcurrentHashMap map = new ConcurrentHashMap<>();
        System.out.println("put:" + map.put("test", "python"));
        System.out.println(map.get("test"));
        System.out.println("put:" + map.put("test", "javascript"));
        System.out.println(map.get("test"));

输出如下:

put:null
python
put:python
javascript

put会返回之前的值,如果之前不存在,则返回null。每次put的时候,都会更新对应的key值。

总结:

是否覆盖value 返回值 返回值
put 覆盖前
putIfAbsent 覆盖前
computeIfAbsent 覆盖后

你可能感兴趣的:(java-web学习)