HashMap的key和value可以为空,ConcurrentHashMap和HashTable不可以,为什么

HashMap在单线程环境中允许key和value为空,而在多线程的ConcurrentHashMap和HashTable中,key和value不允许为空以避免线程安全问题。当key为空时,HashMap会将value存入table[0],导致containsKey(key)返回true,可能引发混淆。在多线程场景中,由于可能存在并发修改,为避免异常,它们不允许key为null。
摘要由CSDN通过智能技术生成

应用场景

HashMap是线程不安全的,所以应用于单线程场景下
ConcurrentHashMap和HashTable是线程安全的,应用于多线程场景下

出现区别的原因

当调用get(key)时,若返回的value为空,能不能确定这个value是存的是null还是因为没有这个key返回的null。

原因

HashMap

因为HashMap是应用在单线程场景下,在源码中,当判断key为空时,会把value存入table[0]处。
当value为空时,可以通过**containsKey(key)**来判断是否有key,若有,则说明返回的null是空value,若没有这个key,则说明返回的null是没有这个key的空。
当存入key和value的都为空时,containskey(key)也会返回true,以为table中有Node节点(Node中的key和value属性都为null)

HashTable和concurrentHashmap

因为这两个集合是应用于多线程场景下,在使用containsKey(key)和get(key)两个方法期间,可能存在其他线程对key的value进行修改,这样,当containsKey(key)返回true后,另一个线程将key删除,这时在get(key)返回的null代表的是没有这个key,但线程却以为是value为空,出现矛盾。

置于为什么key不能为null,可能是为了对应value把,既然value不能为null了,key也不要为null了,以免出现什么不可预料的异常。
(源码就是这样,没有发现有什么具体原因,如果有,欢迎大佬可以提出)

代码

import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;

public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值