2016-03-29 3 views
1

В настоящее время я работаю с ConcurrentHashMap, и я очень хорошо знаком с HashMap, я ожидал подобное поведение HashMap, но когда я вставляю null ключ или значение, ConcurrentHashMap бросает NullPointerException.ConcurrentHashMap против HashMap и NullPointerException

Я видел их источники, 'фрагмент S:

... 
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' в ConcurrentHashMap фрагмент S:

... 
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 вы можете увидеть:

Этот класс и его взгляды и итераторы реализации всех дополнительных методов интерфейсов Карта и итератора.

Как и Hashtable, но в отличие от HashMap, этот класс не разрешает использовать значение null для в качестве ключа или значения.

Этот класс является членом Структуры коллекций Java.

2

Вы можете обратиться Doug Lea комментарий:

Основная причина, по которой Нуль- не допускаются в ConcurrentMaps (ConcurrentHashMaps, ConcurrentSkipListMaps) является то, что неясности, которые могут быть едва терпимой в неконкурирующих карт не может быть размещены. Главное, что если map.get (key) возвращает значение null, вы не можете определить, не отображен ли ключ явным образом к ключу или ключу. На неконкурентной карте вы можете проверить это с помощью map.contains (key), но в параллельном режиме карта может быть изменена между вызовами.

+1

Я мог понять эту причину для ключа, но для значения ?? –