目前我正在与ConcurrentHashMap
合作,并且我非常熟悉HashMap
,我预计会有HashMap
的类似行为,但是当我插入null
键或值,ConcurrentHashMap
会引发NullPointerException
。
我看到了他们的来源,ConcurrentHashMap
的片段:
...
public V put(K key, V value) {
return putVal(key, value, false);
}
...
final V putVal(K key, V value, boolean onlyIfAbsent) {
if (key == null || value == null) throw new NullPointerException();
....
HashMap
的片段:
...
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
...
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
// It Doesn't check null key or value.
....
使用null
键或值时,为什么它们如此不同?这对我来说没有意义。
答案 0 :(得分:2)
你可以参考Doug Lea评论:
在ConcurrentMaps(ConcurrentHashMaps,ConcurrentSkipListMaps)中不允许空值的主要原因是,在非并发映射中几乎不能容忍的模糊性是不能容纳的。主要的一点是,如果map.get(key)返回null,则无法检测密钥是否显式映射到null而不是映射的密钥。在非并发映射中,您可以通过map.contains(key)进行检查,但在并发映射中,映射可能在调用之间发生了变化。
答案 1 :(得分:1)
从documentation您可以看到:
该类及其视图和迭代器实现了所有可选项 Map和Iterator接口的方法。
与Hashtable类似,但与HashMap不同,此类不允许使用null 用作键或值。
此类是Java Collections Framework的成员。