前言
在Java中,ConcurrentHashMap线程安全的集合中的Key或者Value插入 null(空) 值的会报空指针异常,但是单线程操作的HashMap又允许 Key 或者 Value 插入 null(空) 值。这到底是为什么呢?
一、代码展示
1. HashMap 插入 null 值
代码如下(示例):
@Test
public void test(){
System.out.println("搬砖的肖傲楠");
HashMap<String, Object> map = new HashMap();
// 插入 null 值
map.put(null, null);
if (map.containsKey(null)) {
System.out.println("可以插入null");
} else {
System.out.println("不可以插入null");
}
}
输出如下:
结果证明:HashMap 是允许 key 或 value 插入 null 值的
1.2 ConcurrentHashMap插入null值
代码如下(示例):
/**
* @Desc:代码就修改了map的类型赋值,其他不动
*/
@Test
public void test(){
System.out.println("搬砖的肖傲楠");
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>();
// 插入 null 值
map.put(null, null);
if (map.containsKey(null)) {
System.out.println("可以插入null");
} else {
System.out.println("不可以插入null");
}
}
输出如下;
结果证明:报错了,ConcurrentHashMap不能插入 null 值,会报空指针异常
1.3 ConcurrentHashMap 源码分析
如上图所示,进入concurrentHashMap类中put方法,上面种种都有相应的提示,包括注释啊,还有方法参数前面的注解都提示了key和value不能为空,当然为了强防止为空,下一层方法中,开头就判断了传过来的参数是否为空,为空直接抛空指针异常,到这应该就很清晰了吧
1.4 Why
ConcurrentHashMap为什么这么写?
对于 ConcurrentHashMap 不允许插入 null 值的问题,有人问过ConcurrentHashMap 的作者 Doug Lea,当时他回复的消息内容里面说道:不容忍在并发场景下出现歧义,所以从线程的角度来看的话,ConcurrentHashMap是属于多线程,安全的,HashMap属于单线程,属于不安全
总结
以上就是我要提的一个小知识点,每天学习一点点,进步一点点,日积月累,积少成多,积水成河,在成为一拳超人的路上让我们一起加油吧!当然如果有遗漏的点欢迎大家评论留言,如果喜欢就点个关注吧。