ConcurrentHashMap(CHM)中put和putIfAbsent的区别

版权声明:如需转载,请写明出处 https://blog.csdn.net/weixin_43113679/article/details/89439856

put

ConcurrentHashMap<String, String> map =new ConcurrentHashMap<String, String>();
map.put("1","1");
map.put("1","2");
 System.out.println(map.get("1"));

输出为 2
直接把前面的1给覆盖了
put会先判断输入的value是否为,是抛出 NullPointerException()

直接看看集合里是否存在对应的key值,有则把value覆盖,没有则把key和value的放进集合里

putIfAbsent

ConcurrentHashMap<String, String> map =new ConcurrentHashMap<String, String>();
map.putIfAbsent("1","1");
map.putIfAbsent("1","2");
 System.out.println(map.get("1"));

输出为 1
为什么不是 2呢?
这就和它们的源码有关系了
putIfAbsent 会先判断输入的value是否为,是抛出 NullPointerException()
否:
会先查找是否有对应key,
有的话肯定value也有值,因为ConcurrentHashMap的value不允许为空
这时候就会返回输入的value
重点:返回输入的value,集合里key对应的value没有改变,还是原来的value,
没有的话就直接把输入的key和value直接放进集合里,返回null

改进

看过上面就知道put和putIfAbsent的区别了吧,各有利弊,看你怎么用,
putIfAbsent可以改进,变成put,你可以直接重写putIfAbsent方法,也可以在外面根据返回值来判断是否再执行一次put
这个牵扯到原子性,
如果你运用的时候不想知道中间的结果,只要最后的结果,那put就可以,不用管其他的
如果想要中间的结果可以加版本号,

猜你喜欢

转载自blog.csdn.net/weixin_43113679/article/details/89439856
今日推荐