2016-03-29 43 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

我可以理解這個關鍵的原因,但對於價值? –

相關問題