ConcurrentHashMap 为什么不能插入 null?

1、典型回答

简单来说,ConcurrentHashMap 不允许插入 null 值是JDK 源码规定的,如下源码所示(此源码基于JDK 1.8):

从上述源码可以看出,在添加方法的第一句就加了判断:如果 key 值为 null 或者是 value 值为 null,就直接抛出异常 NullPointerException 空指针异常,所以 ConcurrentHashMap 的 key 和 value 都不允许插入 null

2、全面剖析

也就是说,之所以 ConcurrentHashMap 不允许插入 null 是因为JDK 源码的规定,因为 JDK 源码规定不允许插入null 所以就不能插入 null,否则会报空指针异常.

深层次原因

那么问题来了,为什么JDK 源码不允许 ConcurrentHashMap 插入 null?

更深层次的原因是,ConcurrentHashMap 的设计是在多线程下使用的,而如如果 ConcurrentHashMap 的 key 或value 允许为 null 的话,那么程序就会存在二义性问题

什么是二义性问题?

所谓的二义性问题是指含义不清或不明确

如果我们假设 ConcurrentHashMap 允许插入 null,那么此时它就会有二义性问题,这个 null 值就有两层含义

  1. 这个 key 不存在,所以返回 null
  2. key 存在,并且值本身就为 null,所以返回的就是 null

而在多线程下,你没有办法证明真伪,因为你在判断证明的时候,其他线程可能同时做了修改,所以不能被证明的二义性问题需要从源头上杜绝,所以多线程下的 ConcurrentHashMap 是不允许key 和 value 插入 null 值的

注:Hashtable 也是不允许插入 null,原因和 ConcurrentHashMap 是一样的 (因为有二义性问题)

为什么 HashMap 允许插入 null 值?

因为 HashMap 设计是在单线程下使用的,而单线程可以证明真伪,它在进行查询判断的时候,不用担心有其他线程对这个值同时做修改,所以它不存在二义性问题,所以 HashMap 允许 key 和 value 都为 null。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

齐聚“向上的力量”,维谛技术(Vertiv)2024年合作伙伴大会成功举办

3月13日,维谛技术(Vertiv,NYSE:VRT)2024年合作伙伴大会在广东佛山顺利召开,本次大会以“向上的力量”为主题,维谛技术与数百家优秀合作伙伴(含港台)欢聚一堂,…

vue/uniapp路由history模式下宝塔空间链接打开新窗口显示404解决方法

vue/uniapp路由history模式下宝塔空间链接打开新窗口显示404,或者域名后带路径参数刷新就报404 解决方法: 宝塔中站点配置修改:【配置文件】中添加下面代码,具体如图: location / {try_files $uri $uri/ /index.html…

Editor.md-编辑器

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

mac安全干净卸载Anaconda3

使用which python显示当前使用的是/Users/username/anaconda3/bin/python 现在想卸载Anaconda,恢复使用mac系统自带的Python 删除隐藏文件目录 rm -rf ~/.anaconda修改~/.bash_profile文件,将anaconda相关删除 也有可能不是~/.bash_profile而是~/.zs…

三维铁木辛柯梁Matlab有限元编程 | 弹簧支座 | 弹性支撑单元| Matlab源码 | 理论文本

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

【C++】stack、queue模拟实现+仿函数

stack、queue模拟实现仿函数 stack定义stack模拟实现 queue定义queue模拟实现 priority_queue定义priority_queue模拟实现 deque定义底层分析 容器适配器定义种类 仿函数控制类里面数据的比较逻辑回调函数仿函数两者区别 铁汁们,今天给大家分享一篇stack、queue模拟…

移动端使用 echarts中 滚动条 dataZoom 改造为内容区域可以左右滚动

移动端使用 echarts中 滚动条 dataZoom 改造为内容区域可以左右滚动 直接上图 : 主要是下面这段代码: "dataZoom": [{"type": "inside","show": false,"xAxisIndex": [0],"zoomOnMouseWheel&…

Clickhouse 单机部署安装

前言 在大数据的时代背景下,数据的处理和分析能力成为企业竞争力的关键。ClickHouse,作为一款由俄国Yandex公司开发的分布式数据分析型数据库,凭借其卓越的性能和稳定性,赢得了业界的广泛关注。本文将介绍ClickHouse的基本概念、…

Qt/QML编程之路:基于QWidget编程及各种2D/3D/PIC绘制的示例(45)

关于使用GWidget,这里有一个示例,看了之后很多图形绘制,控件使用,及最基本的QWidget编程都比较清楚了。ui的绘制: 运行后的界面如 工程中有非常丰富的关于各种图形的绘制,比如上图中circle,还有image。有下面一段readme的说明: # EasyQPainter Various operation pra…

回到街头 - 数字时尚嘉年华:Web3的时尚未来,4月香港兰桂坊盛大启幕

随着区块链技术的不断发展,Web3世界正在逐渐改变我们的生活方式。作为这一变革的重要推动者,Vertex Labs荣幸地宣布,将在香港举办一场前所未有的“回到街头-数字时尚嘉年华”。这不仅是一场时尚与科技的完美结合,更是全球顶级IP和…

Linux arrch64系统架构 py文件运行时的编码问题解决

问题: 因为要测试一些东西,所以必须有中文数据来做支撑,之前用的架构是x86,现在一个服务器的架构为arrch64,下列编码都挨个都进行声明,但是无法解决问题,总是报错 # -*- coding: gbk -*- # -*…

考研数学——高数:高斯公式

助记: 关于积分时什么时候可以将变量整体代入积分式的问题:在积分过程中,如果某一整体恒为常量,则可以直接替换为定值,常见于对线或面的积分。 而在这题,用高斯公式之前是面积分,如果有这个整体出现的话是…

党费收缴管理系统(十八)关于支付total和payer_total差异的情况处理

在前面我们将支付回调通知解密获取出来的数据 ,amount中有payer_total 和total两个值,正常情况下,这两个值应该是保持一致的。如果这两个值不一样,那么多半是党员缴纳过程使用了支付优惠券。 "amount":{"payer_t…

什么是VPS?如何使用VPS?

什么是VPS?VPS有什么用? VPS是Virtual Private Server的缩写,中文则为虚拟专用服务器,VPS是利用虚拟服务器软件在一台物理服务器上创建多个相互隔离的小服务器,是托管在机房物理服务器上的虚拟机。每个VPS服务器都可分…

Figure与OpenAI 联手推出新机器人;荣耀首款「AI PC」即将发布

▶ Figure 与 OpenAI 联手推出新机器人 AI 机器人公司 Figure 发布了他们与 OpenAI 的合作成果,将 OpenAI 的大模型运用在其机器人 Figure 01 上。 据介绍,OpenAI 大模型加持的 Figure 01 机器人现在可以与人全面对话。 OpenAI 模型为机器人提供了高级…

C# Onnx C2PNet 图像去雾 室内场景

目录 介绍 效果 模型信息 项目 代码 下载 C# Onnx C2PNet 图像去雾 室内场景 介绍 github地址:GitHub - YuZheng9/C2PNet: [CVPR 2023] Curricular Contrastive Regularization for Physics-aware Single Image Dehazing [CVPR 2023] Curricular Contrasti…

【蓝桥杯-单片机】基础模块:数码管

文章目录 【蓝桥杯-单片机】基础模块:数码管01 数码管原理图什么是位选和段选共阳极数码管和共阴极数码管的区分(1)共阳极数码管(Common Anode):(2)共阴极数码管(Common …

mac输入su命令报错如何重置密码

diannao1xiejiandeMacBook-Air ~ % su Password: su: Sorry输入 sudo passwd 命令重置密码即可。

【兔子机器人】实现从初始状态到站立

一、遥想星空up主的方法 由于我有卡位结构,无法做到劈腿,而且底盘也不一样,无法使用此方法 但是其代码思想是可以借鉴的。 参考视频: 【【开源啦!】无刷轮腿平衡机器人】 【精准空降到 01:16】 https://www.bilibili…

LLM - 大语言模型的自注意力(Self-Attention)机制基础 概述

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136623432 注意力(Attention)机制是大型语言模型中的一个重要组成部分,帮助模型决定在处理信息时,所应该关注的部…