avatar

目录
map在put操作时报空指针异常

    今天测试给我提了一个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。

文章作者: 海东青
文章链接: https://haohaogit.github.io/2020/03/19/map%E5%9C%A8put%E6%93%8D%E4%BD%9C%E6%97%B6%E6%8A%A5%E7%A9%BA%E6%8C%87%E9%92%88%E5%BC%82%E5%B8%B8/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hexo
打赏
  • 微信
    微信
  • 支付宝
    支付宝