关于java:ConcurrentHashMap为什么key和value不能为null

思维导图

HashMap源码:


612行:hash()办法计算了key的值

339行:当key为null时,计算出的hash值为0,value搁置在第0个桶上

ConcurrentHashMap源码:


1006行:没有像HashMap一样先计算hash
1011行:先进行了判断key和value是否为null

为什么ConcurrentHashMap须要加空值校验呢?

因为存在二义性问题且ConcurrentHashMap没法解决

二义性问题

测试代码

代码剖析

22行:获取test的value
23行:containsKey判断是否有test
24行:减少test和null值
25行:再次获取test的value
26行:containsKey再次判断是否有test

测试后果

后果剖析

get办法获取到的value的后果都为null。所以当咱们用get办法获取到一个value为null的时候,这里会产生二义性:

  1. 可能没有test这个key
  2. 可能有test这个key,只不过value为null

HashMap如何解决二义性问题

containsKey办法的后果一个为false一个为true,能够通过这个办法来辨别下面说道的二义性问题

ConcurrentHashMap为什么不能解决二义性问题

因为ConcurrentHashMap是线程平安的,个别应用在并发环境下,你一开始get办法获取到null之后,再去调用containsKey办法,没法确保get办法和containsKey办法之间,没有别的线程来捣鬼,刚好把你要查问的对象设置了进去或者删除掉了。

HashMap作者Doug Lea的答复

http://cs.oswego.edu/pipermai…

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理