2016-03-29 45 views
1

目前我与ConcurrentHashMap工作,我很熟悉HashMap,我希望类似的行为HashMap,但是当我插入一个null键或值,ConcurrentHashMap抛出一个NullPointerException的ConcurrentHashMap VS HashMap和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

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ConcurrentHashMap.html:'与Hashtable类似,但与HashMap不同,此类不允许将null用作关键字或价值。' – fukanchik

回答

1

documentation你可以看到:

此类及其视图和迭代器实现所有的地图和Iterator接口的所有可选 方法。

与散列表类似,但与HashMap不同,此类不允许将空值 用作键或值。

此类是Java Collections Framework的成员。

2

你可以参考Doug Lea的评论:

null为不ConcurrentMaps(ConcurrentHashMaps,ConcurrentSkipListMaps)允许的主要原因是含糊不清有可能只是在非并发的地图几乎不能忍受不了被容纳。主要的一点是,如果map.get(key)返回null,则无法检测该键是否显式映射为null,而不是该键未映射。在一个非并发映射中,你可以通过map.contains(key)来检查它,但是在并发映射中,映射可能在调用之间改变。

+1

我可以理解这个关键的原因,但对于价值? –

相关问题