ConcurrentHashMap为什么不能添加null值

首先看hashMap为什么能为null:

首先hashMap的设计是为单线程设计的,我们知道hashMap的get方法中传入的参数如果hashMap中不存在的话就会返回null,假设hashMap中有一个key是null

1存在返回的是null,2不存在返回的也是null,这样不就有两重含义了吗

但是hashMap可以解决这个问题,hashMap中有一个方法containsKey

这样是不是就可以区分了。

然后看ConcurrentHashMap:

有人想问了,ConcurrentHashMap不也有这个方法么,但是我们要明白,ConcurrentHashMap是专门为多线程设计的,我们假设 ConcurrentHashMap 可以存入 null 值,有这样一个场景,现在有一个线程 A 调用了 concurrentHashMap.containsKey(key),我们期望返回的结果是 false,但在我们调用 concurrentHashMap.containsKey(key) 之后,未返回结果之前,线程 B 又调用了 concurrentHashMap.put(key,null) 存入了 null 值,那么线程 A 最终返回的结果就是 true 了,这个结果和我们之前预想的 false 完全不一样。

又因为,concurrentHashMap.containsKey(key) 方法调用的是get方法,如果返回的是null就就返回false,不是null就返回true,如果concurrentHashMap 的value能存储null的话,例如put(1,null),那么containsKey(1)理论上应该是true吧,但是根据源码来看,get(1)是null, null != null 是false,应该返回false,所以说value不能为null。

public boolean containsKey(Object key) {
        return get(key) != null;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值