网易首页 > 网易号 > 正文 申请入驻

【源码解读】JDK1.8 中 ConcurrentHashMap 不支持空键值对源码剖析

0
分享至

>>号外:关注“Java精选”公众号,回复“2021面试题”,领取免费资料! “ Java精选面试题”小程序,3000+ 道面试题在线刷,最新、 最全 Java 面试题!

首先明确一点HashMap是支持空键值对的,也就是null键和null值,而ConcurrentHashMap是不支持空键值对的。

查看一下JDK1.8源码,HashMap类部分源码,代码如下:

public V get(Object key) {
Node e;
return (e = getNode(hash(key), key)) == null ? null : e.value;
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

HashMap在调用put()方法存储数据时会调用hash()方法来计算key的hashcode值,可以从hash()方法上得出当key==null时返回值是0,这意思就是key值是null时,hash()方法返回值是0,不会再调用key.hashcode()方法。

ConcurrentHashMap类部分源码,代码如下:

public V put(K key, V value) {
return putVal(key, value, false);
/** Implementation for put and putIfAbsent */
final V putVal(K key, V value, boolean onlyIfAbsent) {
if (key == null || value == null) throw new NullPointerException();
int hash = spread(key.hashCode());
int binCount = 0;
for (Node[] tab = table;;) {
Node f; int n, i, fh;
if (tab == null || (n = tab.length) == 0)
tab = initTable();
else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
if (casTabAt(tab, i, null,
new Node(hash, key, value, null)))
break; // no lock when adding to empty bin
else if ((fh = f.hash) == MOVED)
tab = helpTransfer(tab, f);
else {
V oldVal = null;
synchronized (f) {
if (tabAt(tab, i) == f) {
if (fh >= 0) {
binCount = 1;
for (Node e = f;; ++binCount) {
K ek;
if (e.hash == hash &&
((ek = e.key) == key ||
(ek != null && key.equals(ek)))) {
oldVal = e.val;
if (!onlyIfAbsent)
e.val = value;
break;
Node pred = e;
if ((e = e.next) == null) {
pred.next = new Node(hash, key,
value, null);
break;

else if (f instanceof TreeBin) {
Node p;
binCount = 2;
if ((p = ((TreeBin)f).putTreeVal(hash, key,
value)) != null) {
oldVal = p.val;
if (!onlyIfAbsent)
p.val = value;


if (binCount != 0) {
if (binCount >= TREEIFY_THRESHOLD)
treeifyBin(tab, i);
if (oldVal != null)
return oldVal;
break;

addCount(1L, binCount);
return null;

ConcurrentHashmap在调用put()方法时调用了putVal()方法,而在该方法中判断key为null或value为null时抛出空指针异常NullPointerException。

ConcurrentHashmap是支持并发的,当通过get()方法获取对应的value值时,如果指定的键为null,则为NullPointerException,这主要是因为获取到的是null值,无法分辨是key没找到null还是有key值为null。

往期精选 点击标题可跳转

面试官问:为什么 Java 线程没有 Running 状态?一下被问懵!

SpringBoot + Mybatis + Druid + PageHelper 实现多数据源并分页(附源码)

Intellij IDEA 中的各种调试代码技巧,轻松定位 Bug 问题(涵盖超全面)

MyBatis 真坑!Integer 类型赋值 0 ,当 != '' 时无法通过判断执行 SQL 语句

面试官问:Spring Boot 中实现通用 Auth 认证,有哪几种方式?

Spring 中 IService 有多个实现类,它是如何知道该注入哪个 ServiceImpl 类?

突然慌了!面试官问:线程池中多余的线程是如何回收的?

MySQL 数据库中百万级数据量,大神是如何分页查询?

数据库中 SQL 语句使用索引,还是很慢?可能是这几点原因

Spring Boot 框架中实现跨域访问的五种解决方案,你懂了吗?

面试官问:导致 Spring 事务失效的场景有哪些,如何解决失效问题?

点个赞,就知道你“在看”!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
日本宣布部署导弹不到1天,中方40家反制名单落地,专打军工七寸

日本宣布部署导弹不到1天,中方40家反制名单落地,专打军工七寸

健身狂人
2026-06-29 20:02:28
韩国队启程回国,众国脚低头回避镜头,每人将获35.5万元奖金;多家酒馆、烤肉店公告“洪明甫不得入内”,韩国球迷怒喷洪明甫

韩国队启程回国,众国脚低头回避镜头,每人将获35.5万元奖金;多家酒馆、烤肉店公告“洪明甫不得入内”,韩国球迷怒喷洪明甫

蓬勃新闻
2026-06-29 14:40:01
耻辱!德国前18次世界杯4冠4亚4季17次八强,近三届无缘16强

耻辱!德国前18次世界杯4冠4亚4季17次八强,近三届无缘16强

懂球帝
2026-06-30 07:58:10
官方否认宜宾地震与页岩气开采有关,称会进行监测!专家分析

官方否认宜宾地震与页岩气开采有关,称会进行监测!专家分析

南方都市报
2026-06-29 21:13:05
博主称车载螺纹接口是华为口,已申请专利,小米被迫使用,未来政策收紧,还要交专利费!网友:节奏带得飞起

博主称车载螺纹接口是华为口,已申请专利,小米被迫使用,未来政策收紧,还要交专利费!网友:节奏带得飞起

大白聊IT
2026-06-29 17:52:55
为何能逆转日本?安切洛蒂一句话救了巴西 无愧老江湖 尽显冠军相

为何能逆转日本?安切洛蒂一句话救了巴西 无愧老江湖 尽显冠军相

萌兰聊个球
2026-06-30 07:42:05
赛后遭巴西球员挑衅,盐贝健人:既然造成误解,我也无话可说

赛后遭巴西球员挑衅,盐贝健人:既然造成误解,我也无话可说

懂球帝
2026-06-30 06:11:08
法拉利被当滑梯后续:家长只愿赔五百,警方介入,车主硬气维权

法拉利被当滑梯后续:家长只愿赔五百,警方介入,车主硬气维权

史料布籍
2026-06-29 18:20:42
世界杯巨大争议!佐野海舟逃红后破门,球员集体抗议,媒体人开炮

世界杯巨大争议!佐野海舟逃红后破门,球员集体抗议,媒体人开炮

奥拜尔
2026-06-30 01:49:43
40岁超模晒透视装露点照遭围攻,她怒怼:胸部切过3次还给俩娃喂过奶,这算什么性感

40岁超模晒透视装露点照遭围攻,她怒怼:胸部切过3次还给俩娃喂过奶,这算什么性感

赴一场山海啊
2026-06-30 00:55:22
日本1:2!淘汰不可怕,可怕的是森保一的这番话,夺冠目标不变!

日本1:2!淘汰不可怕,可怕的是森保一的这番话,夺冠目标不变!

田先生篮球
2026-06-30 05:54:58
执法者涉黄被抓,居然悄悄换个岗位继续上班?

执法者涉黄被抓,居然悄悄换个岗位继续上班?

燕梳楼频道
2026-06-29 15:55:03
男子在家“一丝不挂”,被女邻居拍照发到业主群“公开处刑”,男子报警并怒斥:你犯法了知道吗!

男子在家“一丝不挂”,被女邻居拍照发到业主群“公开处刑”,男子报警并怒斥:你犯法了知道吗!

天涯社区
2026-06-29 17:50:51
董路:我又封神了!全中国我第一个说日本足球到头了 巴西45度炸

董路:我又封神了!全中国我第一个说日本足球到头了 巴西45度炸

念洲
2026-06-30 08:26:18
630G 机密外泄iPhone18 全套图纸从印度代工厂流出,苹果底牌全曝光

630G 机密外泄iPhone18 全套图纸从印度代工厂流出,苹果底牌全曝光

小兔子发现大事情
2026-06-30 00:34:50
3人罚丢点球,德国4-5不敌南美劲旅,止步世界杯32强

3人罚丢点球,德国4-5不敌南美劲旅,止步世界杯32强

侧身凌空斩
2026-06-30 07:29:39
4-6,4-6!金花郑钦文又输了:连续4年温网一轮游,3次不敌同一人

4-6,4-6!金花郑钦文又输了:连续4年温网一轮游,3次不敌同一人

全景体育V
2026-06-30 03:32:33
上半场封神 下半场崩盘!安帅1招击溃日本铁桶阵,巴西赢在教练!

上半场封神 下半场崩盘!安帅1招击溃日本铁桶阵,巴西赢在教练!

看透足球专栏
2026-06-30 03:57:30
德国第5次在世界杯进入点球大战,此前4次全胜

德国第5次在世界杯进入点球大战,此前4次全胜

懂球帝
2026-06-30 07:26:16
巴西补时“绝杀”,日本出局,森保一:是我水平不足

巴西补时“绝杀”,日本出局,森保一:是我水平不足

扬子晚报
2026-06-30 07:27:59
2026-06-30 08:56:49
Java精选
Java精选
一场永远也演不完的戏
1795文章数 3859关注度
往期回顾 全部

科技要闻

DeepSeek V4正式版要来 高峰期API价格翻倍

头条要闻

牛弹琴:韩国对男足耻辱出局激烈反应 全世界震惊不已

头条要闻

牛弹琴:韩国对男足耻辱出局激烈反应 全世界震惊不已

体育要闻

日本众将掩面痛哭 连续3届先破门却被逆转

娱乐要闻

跟风电影《给阿公的牛肉丸》开机

财经要闻

中欧贸易投资磋商机制联合声明

汽车要闻

全新宝马iX3长轴版将于成都车展预售 四季度交付

态度原创

本地
家居
亲子
手机
数码

本地新闻

贵州小城的新目标:举办“村超”世界杯!

家居要闻

传奇筑 日常诗

亲子要闻

聚焦母婴健康,“妇幼健康大家谈”公益讲座在宝安开讲

手机要闻

苹果印度供应商塔塔电子被黑,iPhone 18 Pro机密文件现身暗网

数码要闻

从「大APP」到「大任务」:vivo黄韬谈折叠屏AI轻办公哲学

无障碍浏览 进入关怀版