ConcurrentHashMap为什么不允许插入null值?

在Java语言中,给ConcurrentHashMap和HashTable这些线程安全的集合中的key或者value插入null(空)值时,会报空指针异常,但是单线程操作的HashMap又运行key或者 value插入null(空)

1、查看源码

源码如下:

从源码来看,在key或者value为null(空)时,直接抛出空指针异常

为什么ConcurrentHashMap 的key或者value不允许插入null(空),而HashMap允许插入那?

2、问题分析

因为给ConcurrentHashMap加null(空)值会存在歧义,假设ConcurrentHashMap允许存储null(空)那么,我们取值的时候会出现两种结果:

1)值没有在集合中,取出的是null

2)值就是null,所以返回的结果就是原本的null值

这种情况下就会出现歧义

HashMap允许插入null(空值),是因为HashMap是针对单线程设计的,所以在取到null(空)时我们可以通过HashMap的containsKey(key)区分这个null(空)值是插入的null值,还是本来就没有返回的null(空);

那么就有人会有疑问了,ConcurrentHashMap里面也有containsKey();是不是可以区分那?

在单线程的情况下这个是没有问题的,但是ConcurrentHashMap是针对多线程的,多线程的情况下情况比较复杂的。

假如我们有两个线程T1和T2

当T1线程调用ConcurrentHashMap的containsKey(key)判断结果为false,说明T1并没有向ConcurrentHashMap 中put   null(空)值;然后在T1线程还没返回结果之前:T2线程调用了ConcurrentHashMap的put方法,插入一个key,并存入的value是一个null(空)值进来,那么T1线程调用ConcurrentHashMap的containsKey(key)的结果就是true了。

显然这个结果和我们之前期望的值false是不同的,

也就是说在多线程的复杂的情况下,到底是插入的null(空)值,还是本来就没有此key值返回的null(空)值,会存在歧义

3、总结

ConcurrentHashMap不允许插入null(空)值,主要是为了避免在并发场景下出现歧义的问题(源码中直接抛出异常的)。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值