ConcurrentHashMap vs HashMap和NullPointerException

时间:2016-03-29 20:03:23

标签: java hashmap concurrenthashmap

目前我正在与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键或值时,为什么它们如此不同?这对我来说没有意义。

2 个答案:

答案 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的成员。

相关问题