首页 资讯 > > 正文

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

2023-05-09 17:14:51 来源:清一色财经 分享到:

​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。

关键词:

x 广告

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

​ConcurrentMap(如ConcurrentHashMap、ConcurrentSkipListMap)不允许使用Null值的主要原因是,在非并发

2023成都孩子入学预防接种证查验办理指南

1、查验对象所有新入托、入学、转学、插班的儿童。2、查验费用办理《儿童预防接种情况审核报告》是不收取费

热门:英国4月Halifax房价指数同比仅上涨0.1% 创10年来最小涨幅

智通财经APP获悉,抵押贷款机构Halifax周二表示,4月英国房价同比仅上涨0 1%,这是自2012年12月以来的最小

世界即时看!祥生医疗(688358)5月9日主力资金净卖出1273.18万元

截至2023年5月9日收盘,祥生医疗(688358)报收于56 66元,上涨3 72%,换手率5 89%,成交量6 6万手,成交额3 93亿元。

焦点快播:川渝近300家公立医院年内将实现检查检验结果互认

近日,重庆市卫生健康委发布《关于加快推进川渝两地二级及以上医疗机构检查检验结果互认工作的通知》。相关

x 广告

Copyright   2015-2022 亚洲地质网版权所有  备案号:豫ICP备20022870号-9   联系邮箱:553 138 779@qq.com