HashMap的key,value都可以为null,ConcurrentHashMap的key,value都不能为null

探讨这个问题,我们先要知道HashMap和ConcurrentHashMap的使用场景,我们都知道HashMap是线程不安全的,一般不会用于多线程场景下;而ConcurrentHashMap是线程安全的,多用于多线程场景下。

源码拦截了

在这里插入图片描述

ConcurrentHashMap多线程场景下的二意性

我们先讨论value为啥不能为null,我们做个假设,假设ConcurrentHashMap支持value为null

String value = concurrentHashMap.get(key)

此时value返回为null,我们是不知道是由于key不存在导致返回null,还是本来value就是null,此处就有二义性了。
此时有人就会疑惑HashMap也会存在这个问题呀,但是HashMap可以通过containsKey来确认返回null是key不存在还是本来就是null(单线程场景)
而多线程情况下,ConcurrentHashMap中的value不能为null,证明如下:

有A、B两个线程。

线程A调用concurrentHashMap.get(key)方法,返回为null,我们还是不知道这个null是没有映射的null还是存的值就是null。

我们假设此时返回为null的真实情况就是因为这个key没有在map里面映射过。那么我们可以用concurrentHashMap.containsKey(key)来验证我们的假设是否成立,我们期望的结果是返回false。

但是在A调用concurrentHashMap.containsKey(key)后,值返回前,B线程设置concurrentHashMap.put(key,null),此时其实A调用的concurrentHashMap.containsKey(key)的结果应该是true,但是返回的是false。
故concurrentHashMap.containsKey(key)没法解决多线程下存在的二意性问题。

ConcurrentHashMap为啥key不能为null

翻阅很多文档后,并没有找到满意的答案,我理解就是没有必要支持key为null的情况,如果看官有什么其他见解,可以留言讨论。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值