最近在梳理總結《集合 - 經常使用Map之間區別》, 其中有一點就是 HashMap 是支持null鍵和null值,而 ConcurrentHashMap 是不支持的;html
後來查看了一下jdk源碼,證實了確實是這樣的。java
HashMap.java 部分源碼編程
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
ConcurrentHashMap.java 部分源碼多線程
/** Implementation for put and putIfAbsent */ final V putVal(K key, V value, boolean onlyIfAbsent) { if (key == null || value == null) throw new NullPointerException(); int hash = spread(key.hashCode()); int binCount = 0; ...... }
後來,當有人問起我爲何ConcurrentHashMap不支持null key value時,我卻只能說源碼裏就那麼寫的,殊不知爲什麼!併發
上網google了一下,發現一片很不錯的文章關於ConcurrentHashMap爲何不能put null,正好能解釋個人疑惑。app
裏面提到:框架
ConcurrentHashMap不能put null 是由於 沒法分辨是key沒找到的null仍是有key值爲null,這在多線程裏面是模糊不清的,因此壓根就不讓put null。
裏面重點提到一個大師Doug Lea,聽說是ConcurrentHashMap的做者,趕忙查看了源碼:this
/** * ... * Java Collections Framework</a>. * * @since 1.5 * @author Doug Lea * @param <K> the type of keys maintained by this map * @param <V> the type of mapped values */ public class ConcurrentHashMap<K,V> extends AbstractMap<K,V> implements ConcurrentMap<K,V>, Serializable { private static final long serialVersionUID = 7249069246763182397L; ... }
原來整個java.util.concurrent大多都是Lea大師的做品,值得細細品味。google