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; }