上一篇 List 踩坑文章中,我们提到几个比较容易踩坑的点。作为 List 集合好兄弟 Map,我们也是天天都在使用,一不小心也会踩坑。
今天我就来总结这些常见的坑,再捞自己一手,防止后续同学再继续踩坑。
本文设计知识点如下:
不是所有的 Map 都能包含 null
这个踩坑经历还是发生在实习的时候,那时候有这样一段业务代码,功能很简单,从 XML 中读取相关配置,存入 Map 中。
代码示例如下:
那时候正好有个小需求,需要改动一下这段业务代码。改动的过程中,突然想到 HashMap
并发过程可能导致死锁的问题。
于是改动了一下这段代码,将 HashMap
修改成了 ConcurrentHashMap
。
美滋滋提交了代码,然后当天上线的时候,就发现炸了。。。
应用启动过程发生 NPE 问题,导致应用启动失败。
根据异常日志,很快就定位到了问题原因。由于 XML 某一项配置问题,导致读取元素为 null,然后元素置入到 ConcurrentHashMap
中,抛出了空指针异常。
这不科学啊! 之前 HashMap
都没问题,都可以存在 null,为什么它老弟 ConcurrentHashMap
就不可以?
翻阅了一下 ConcurrentHashMap#put
方法的源码,开头就看到了对 KV 的判空校验。
看到这里,不知道你有没有疑惑,为什么 ConcurrentHashMap
与 HashMa