美团太细了,HashMap可以存Null,ConcurrentHashMap不可以,为什么?

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

我们知道,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。

责任编辑:姜华 来源: Hollis
相关推荐

2021-04-16 17:02:21

数组C++语言

2015-06-25 13:29:21

2014-11-28 16:04:36

浪潮

2023-08-22 20:43:09

HashMap单线程null

2020-10-21 09:16:49

Linux开源操作系统

2022-05-19 10:04:15

UIAndroid子线程

2022-05-08 18:18:40

JDKValueHashMap

2009-01-11 10:05:44

邮件宕机摩卡

2022-01-27 07:02:52

JavaHashMap单线程

2019-10-24 15:20:10

微信分享

2021-02-03 14:40:22

Python字典语言

2020-03-23 12:58:34

美团公有云互联网

2016-04-01 12:25:12

华为32路服务器/华为

2015-07-02 10:15:42

密码

2022-03-07 00:21:26

互联网IP域名

2020-12-30 10:04:46

userMapper接口

2024-12-13 15:37:55

2019-08-07 11:46:45

电脑软件硬件

2024-10-25 14:39:26

BigDecimal精度数值

2022-07-26 07:14:20

线程隔离Thread
点赞
收藏

51CTO技术栈公众号