ConcurrentHashMap(CHM)中put和putIfAbsent的区别

本文详细探讨了ConcurrentHashMap中put和putIfAbsent方法的区别,通过实例演示了两种方法在多线程环境下如何处理键值对的更新,揭示了它们在原子性和中间结果处理上的不同策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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就可以,不用管其他的
如果想要中间的结果可以加版本号,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值