为什么HashMap的键值可以为null,而ConcurrentHashMap不行?
为什么HashMap的键值可以为null,而ConcurrentHashMap不行?
根本原因:二义性问题,无法判断get(key)返回的Null值到底是因为不存在这个key,还是因为这个key对应的value就是Null
1. HashMap
HashMap允许一个Null key和多个Null value,为什么HashMap没有二义性问题?
因为HashMap是为单线程设计的,在单线程的情况下,即便get(key)返回了Null,也可以通过containsKey(key)来判断是否存在这个key,从而破除了二义性问题。
2. ConcurrentHashMap
ConcurrentHashMap不允许Null key和Null value
ConcurrentHashMap使用的场景是多线程,假设ConcurrentHashMap可以存入Null值,有这样一个场景,现在有一个线程A先调用concurrentHashMap.get(key),由于key不存在,返回了Null值;这时候再去调concurrentHashMap.containsKey(key),在返回结果之前,线程B又调用了concurrentHashMap.put(key,Null)存入了Null值,那么线程A最终返回的结果就是true,按照这个结果,线程A就会做出判断:前面调用get(key)方法返回Null值的原因是因为key所对应的value就是Null,这显然是不对的,因为线程A调用get(key)方法时,Null值还没被存入
为什么HashMap的键值可以为null,而ConcurrentHashMap不行?
http://example.com/2026/01/19/为什么HashMap的键值可以为null,而ConcurrentHashMap不行?/