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年合作伙伴大会在广东佛山顺利召开,本次大会以“向上的力量”为主题,维谛技术与数百家优秀合作伙伴(含港台)欢聚一堂,…

【25届秋招备战C++】算法篇-贪心算法(Greedy)

【25届秋招备战C】算法篇-贪心算法 一、简介二、解题思路三、应用场景四、模板函数五、参考 一、简介 一种在每次决策时,总是采取在当前状态下的最好选择,从而希望导致结果是最好或最优的算法。通常用于解决一些最优化问题,如找零问题、霍夫…

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

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

【MySQL 系列】MySQL 引擎篇

存储引擎是 MySQL 的组件,用于处理不同表类型的 SQL 操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。 文章目录 1、MySQL 引擎介绍1.1、MySQL 引擎介绍1.2、常见引擎及其区别和…

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…

深入理解FTP协议:文件传输的桥梁

深入理解FTP协议:文件传输的桥梁 在数字化时代,文件传输协议(FTP)是互联网上进行文件交换的重要手段。FTP允许用户在不同的计算机之间传输文件,无论是上传还是下载,都提供了一种稳定且高效的方式。本文将深…

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

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

macOS 安装使用 python 虚拟机

在macOS上安装Conda的步骤相对简单。Conda通常通过Anaconda或Miniconda进行安装,Anaconda是一个包含了Conda、Python和许多科学包及其依赖的发行版,而Miniconda则是一个更轻量级的版本,只包含Conda和Python。以下是在macOS上安装Anaconda的步…

Spring Boot启动时执行初始化操作的几种方式

场景 项目中,经常需要在启动过程中初始化一些数据,如从数据库读取一些配置初始化,或从数据库读取一些热点数据到redis进行初始化缓存。 方式一:实现CommandLineRunner 接口重写run方法逻辑 CommandLineRunner是Spring提供的接口&#xff0…

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

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

数据库学习案例20240311 -mysql xtrabackup 备份与恢复

下载使用 Software Downloads - Percona 下载需要的依赖包 yum install perl-DBI -y yum install perl-DBD-MySQL -y yum install perl-Time-HiRes -y yum install perl-IO-Socket-SSL -y yum install perl-TermReadKey.x86_64 -y 下载安装配置完环境变量,然后做…

移动端使用 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 -*- # -*…

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

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

在C#中使用NModbus4通信库执行【读】操作

在工业自动化和控制系统中,Modbus协议是一种广泛使用的通信协议。它是一种基于主从结构的串行通信协议,简单、可靠且易于实现。在C#中,可以使用NModbus4库来执行Modbus通信。本文将详细介绍如何使用NModbus4库在C#中执行Modbus读操作。 1. N…

掌握Go语言:深入理解Go语言数组,基本原理与示例解析(15)

理解数组是理解编程语言中基本数据结构的重要一步。在Go语言中,数组是具有固定长度且由相同数据类型的元素组成的有序集合。下面我们将更详细地解释Go语言数组的各个方面。 1. 声明数组 在Go语言中,声明数组需要指定数组的长度和元素类型。语法如下&am…