HashMap、ConcurrentHashMap、HashTable和TreeMap 为啥有的支持key支持null,有的value支持null?
创始人
2024-03-05 07:19:35
0
HashMap、ConcurrentHashMap、HashTable和TreeMap相信小伙伴们都不陌生,他们之间的区别在面试中经常会被问道。key/value能不能是null,是我们必答的一条,相信你们也都能说出来。但继续向下追问一下,为啥有的key可以是null,有的value可以是null,可能就会让面试场面尬住了…
类型key可以为nullvalue可以为null
HashMaptruetrue
HashTablefalsefalse
ConcurrentHashMapfalsefalse
TreeMapfalsetrue
上表给出了key/value是否可以为null的情况。

1、为啥key不能为null?
HashMap可以为null:
Oracle公司的技术负责人Stuart Marks说:将允许空键的决定视为最初犯的错误。我们可以看出HashMap允许key为null只是一个意外…
HashTable、ConcurrentHashMap、TreeMap不可以为null:
如下代码所示,每个对象的hash值是根据对象的hashcode码计算出来的。如果对象为null,调用它的hashCode()方法一定会抛出空指针异常。

 static final int hash(Object key) {int h;// h >>> 16 无符号右移16位// 将前16位与后16位进行异或作为hash值,让对象更加分散的入桶。return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}

2、为啥value不能为null?
这里我们将map分为两类,一类是并发的ConcurrentHashMap/HashTable等,另一类是非并发的HashMap/TreeMap.
线程不安全map,它的Value是可以为null的。以HashMap为例子,为啥允许为null:

HashMap map = new HashMap();
Object result = map.get("xiaohong"); ==>因为不存在xiaohong这个值,所以返回的是null。这时候就存在歧义了,返回的null代表的是entry的value为null,还是压根就没有这个entry。为了区分,我们可以继续判断。
bool status = map.containsKey("xiaohong") ⇒ 这时候返回true说明,result代表的是entry的value值为null;反之,则entry不存在;

使用contains方法我们就可以推断出get方法返回的null代表的是啥意思。
下面分析,并发map为啥value不能为null:

        ConcurrentHashMap map = new ConcurrentHashMap<>();Object result = map.get("xiaohong");  // 因为不存在xiaohong这个值,所以返回的是null。这时候就存在歧义了,返回的null代表的是entry的value为null,还是压根就没有这个entry。为了区分,我们尝试继续判断####################其他线程操作map   开始####################map.put("xiaohong",”sno2020190“);####################其他线程操作map    结束####################bool status = map.containsKey("xiaohong") ==> 返回值为true, 我们会误认为result为null是由于entry中的value为nul造成的。这时候会认为,键值是xiaohong的value为null,这就出错了。

相关内容

热门资讯

海南自贸区涨停潮背后:政策红利... 12月22日上午,A股市场迎来久违的“多点开花”——三大指数齐涨,而最引人注目的,莫过于海南自贸区板...
深圳:深入实施跨境贸易投资高水... 人民财讯12月23日电,深圳市人民政府印发《深圳市进一步加大吸引和利用外资实施办法》,其中提出,进一...
国家发展改革委等三部门完善幼儿... 中新网12月23日电 据国家发展改革委网站消息,近日,为深入贯彻党的二十大和二十届历次全会精神,落实...
建工修复(300958)披露累... 截至2025年12月23日收盘,建工修复(300958)报收于12.39元,较前一交易日下跌0.88...
红豆股份(600400)披露拟... 截至2025年12月23日收盘,红豆股份(600400)报收于2.4元,较前一交易日下跌2.83%,...
凌钢股份与江苏银行深圳分行纠纷... 12月23日,凌钢股份(600231)发布公告,近期公司收到辽宁省朝阳市中级人民法院的民事裁定书,案...
科蓝软件:科蓝盛合陷合同纠纷 ... 12月23日,科蓝软件(300663)发布公告,控股股东一致行动人宁波科蓝盛合投资管理合伙企业(有限...
广东潮州通报“因购物纠纷引发的... 本文转自【看潮州客户端】; 情况简讯 记者获悉,12月18日,在市区枫春路发生一起因购物纠纷引发的殴...