今天测试给我提了一个bug,是个空指针异常,我一想应该是对象为空时,没有做判断就使用这个对象做某个操作所致。可是在我打开日志时发现竟然出错的地方是条Map做put操作,这是什么鬼…

根据程序报错的位置,找到了报错的最原始语句,通过下图我们可以看到:当map的key值和value值为空时就会抛出异常。

回到我写的代码处,发现我使用的是ConcurrentHashMap

到这里我就明白了,再次回顾了HashMap、ConcurrentHashMap和HashTable三种数据结构的差异点:
HashMap的key值和value值都可以为空;非线程安全
ConcurrentHashMap和HashTable的key值和value值都不可以为空;线程安全
总结
ConcurrentHashMap不使用null的主要原因是在并发的情况下会存在歧义。如果
map.get(key)
返回是null,不能检测出是这个key创建映射的时候就是null,还是没有映射过。不是并发映射中,可以通过map.contains(key)
在检查,而在并发映射中,两次调用之间的映射可能已经更改。当然程序中在保证key值和value不为空的情况下,为了线程安全推荐将HashMap替换为ConcurrentHashMap。