HashMap是线程不安全的,用于单线程环境,ConcurrentHashMap是线程安全的,可用于多线程并发场景;
HashMap 支持null键和null值,而 ConcurrentHashMap 不支持;
ConcurrentHashMap putValue源码
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不能put null 是因为 无法分辨是key没找到的null还是有key值为null,这在多线程里面是模糊不清的,所以压根就不让put null。
HashMap是非并发的,可以通过contains(key)来做这个判断。而支持并发的Map在调用m.contains(key)和m.get(key),m很可能已经不同了
参考资料
ConcurrentHashMap是如何实现线程安全的
ConcurrentHashMap为何不支持null键和null值