putIfAbsent和computeIfAbsent
都是在key不存在的时候才会建立key和value的映射关系;
putIfAbsent不论传入的value是否为空,都会建立映射(并不适合所有子类,例如HashTable),而computeIfAbsent方法,当存入value为空时,不做任何操作
当key不存在时,返回的都是新的value(为什么不说新插入的value),即使computeIfAbsent在传入的value为null时,不会新建映射关系,但返回的也是null;
computeIfPresent和computeIfAbsent
这两个方法正好相反,前者是在key存在时,才会用新的value替换oldValue
当传入的key存在,并且传入的value为null时,前者会remove(key),把传入的key对应的映射关系移除;而后者不论何时都不会remove();
前者只有在key存在,并且传入的value不为空的时候,返回值是value,其他情况都是返回null;后者只有在key不存在,并且传入的value不为null的时候才会返回value,其他情况都返回null;
compute
新传入的value不为null就建立映射关系(也就是说不论key是否为null,具体子类再具体分析)
新传入的value为null时:key已存在,且老的对应value不为null,移除改映射关系,返回null;否则,直接返回null