写点什么

美团太细了!HashMap 可以存 null,ConcurrentHashMap 不可以为什么

作者:Java你猿哥
  • 2023-05-09
    湖南
  • 本文字数:630 字

    阅读完需:约 2 分钟

美团太细了!HashMap可以存null,ConcurrentHashMap不可以为什么

我们知道,ConcurrentHashMap 在使用时,和 HashMap 有一个比较大的区别,那就是 HashMap 中,null 可以作为键或者值都可以。而在 ConcurrentHashMap 中,key 和 value 都不允许为 null。

那么,为什么呢?为啥 ConcurrentHashMap 要设计成这样的呢?

关于这个问题,其实最有发言权的就是 ConcurrentHashMap 的作者——Doug Lea。

他自己曾经出面解释过这个问题,内容如下(原文地址已经打不开了,大家将就着看一下截图吧) :


主要意思就是说:

ConcurrentMap(如 ConcurrentHashMap、ConcurrentSkipListMap)不允许使用 null 值的主要原因是,在非并发的 Map 中(如 HashMap),是可以容忍模糊性(二义性)的,而在并发 Map 中是无法容忍的。

假如说,所有的 Map 都支持 null 的话,那么 map.get(key)就可以返回 null,但是,这时候就会存在一个不确定性,当你拿到 null 的时候,你是不知道他是因为本来就存了一个 null 进去还是说就是因为没找到而返回了 null。

在 HashMap 中,因为它的设计就是给单线程用的,所以当我们 map.get(key)返回 null 的时候,我们是可以通过 map.contains(key)检查来进行检测的,如果它返回 true,则认为是存了一个 null,否则就是因为没找到而返回了 null。

但是,像 ConcurrentHashMap,它是为并发而生的,它是要用在并发场景中的,当我们 map.get(key)返回 null 的时候,是没办法通过通过 map.contains(key)检查来准确的检测,因为在检测过程中可能会被其他线程锁修改,而导致检测结果并不可靠。

所以,为了让 ConcurrentHashMap 的语义更加准确,不存在二义性的问题,他就不支持 null。

用户头像

Java你猿哥

关注

一只在编程路上渐行渐远的程序猿 2023-03-09 加入

关注我,了解更多Java、架构、Spring等知识

评论

发布
暂无评论
美团太细了!HashMap可以存null,ConcurrentHashMap不可以为什么_Java_Java你猿哥_InfoQ写作社区