ConcurrentHashMap的源码中在put的值的时候不允许key或者value为null,插入null会报空指针异常。

主要时为了避免多线程中的二义性,避免歧义。
value为null是因为插入的值就是null
没有映射的key也会返回null
当get一个值的时候返回了一个null无法判断是这个值就是null呢?还是说本来就没有映射到这个key。
比如此时我们有两个线程A和B。
假设当A线程调用get(key)方法时返回了一个null值,此时我们无法判读这个键值对他是key根本就不存在还是因为他的value就是null。
所以此时我们要调用containsKey(key)来判断key是否存在。但是就在此时有一个线程B调用了put(key,null)方法。我们不能确定到底是A线程先执行,还是B线程先执行的,所以返回值有可能是true也有可能是false。这就存在了二义性有歧义。所以ConcurrentHashMap不允许值为null。
ConcurrentHashMap和HashTable都是在高并发的场景下使用的所以为了避免存在歧义,将不允许key/value为null。
而HashMap正确的使用场景是没有线程安全问题的场景下,所有不用考虑这种二义性。