为什么Hashtable不允许插入nuIl键和null值?

1、典型回答

浅层次的来回答这个问题的答案是,JDK 源码不支持 Hashtable 插入 value 值为 null,如以下 JDK 源码所示:

也就是 JDK 源码规定了,如果你给 Hashtable 插入 value 值为 null 就会抛出空指针异常。

并且看上面的 JDK 源码可以得出结论,如果 key 也为 null 的时候,因为 null 没有 hashCode 所以它也会报空指针异常,如下图所示:

2、考点分析

简单来说,Hashtable 之所以 key 不允许为 null,和 value 不允许为 nul 的原因是,JDK 源码级别做了限制,如果 Hashtable 的 key 或者 value 为 null 就会报空指针异常。

3、知识扩展

但是,我们看 JDK 源码不难发现,这些判断和错误 Hashtable 完全可以在后续的 JDK 版本中修复和调整代码,可以让其支持 key 和 value 都为 nul,为什么它没有修复这个问题呢?

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

什么是二义性问题?

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

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

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

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

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

为什么 HashMap 允许插入 null 值?

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何搭建DolphinScheduler服务并结合内网穿透公网远程任务调度

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问,结合内…

Stable Diffusion WebUI 生成参数:宽度/高度/生成批次/每批数量/提示词相关性/随机种子

本文收录于《AI绘画从入门到精通》专栏,专栏总目录:点这里。 大家好,我是水滴~~ 本文将继续了解 Stable Diffusion WebUI 的生成参数,主要内容有:宽度、高度、生成批次、每批数量、提示词相关性、随机种子。希望能对你…

大模型主流微调训练方法总结 LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning 并训练自己的数据集

大模型主流微调训练方法总结 LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning 概述 大模型微调(finetuning)以适应特定任务是一个复杂且计算密集型的过程。本文训练测试主要是基于主流的的微调方法:LoRA、Adapter、Prefix-tuning、P-tuning和Prompt-tuning,并对…

STM32驱动CC1101时的正确配置和一些遇到的坑

项目背景 由于项目需要用到CC1101-Q1,所以买了CC1101的模块和驱动底板,插电脑上一发一收。串口调试助手查看接收端的数据,测试正常。 然后想用STM32来驱动其中的一块CC1101模块作为发送端,和另一个买来的接收端测试通信。找到一份STM32驱动CC1101Demo代码,分为软件模拟S…

Certum代码签名证书

代码签名证书是一种数字证书,用于验证软件开发者身份和保证软件完整性的技术。它的作用在于确保软件在传输和安装过程中没有被篡改或损坏,并且确认软件来自可信的开发者。通过代码签名证书,用户可以更放心地下载和安装软件,降低安…

【Linux】文件描述符 - fd

文章目录 1. open 接口介绍1.1 代码演示1.2 open 函数返回值 2. 文件描述符 fd2.1 0 / 1 / 22.2 文件描述符的分配规则 3. 重定向3.1 dup2 系统调用函数 4. FILE 与 缓冲区 1. open 接口介绍 使用 man open 指令查看手册&#xff1a; #include <sys/types.h> #include …

AI系统性学习06—开源中文语言大模型

1、ChatGLM ChatGLM-6B的github地址&#xff1a;https://github.com/THUDM/ChatGLM-6B ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级…

透视未来工厂:山海鲸可视化打造数字孪生新篇章

在信息化浪潮的推动下&#xff0c;数字孪生工厂项目正成为工业制造领域的新宠。作为一名山海鲸可视化的资深用户&#xff0c;我深感其强大的数据可视化能力和数字孪生技术在工厂管理中的应用价值&#xff0c;同时我们公司之前也和山海鲸可视化合作制作了一个智慧工厂项目&#…

OceanBase生产环境安装部署的最优实践

关于生产环境&#xff0c;为了尽量确保性能和稳定性&#xff0c;我们比较建议采用标准化的配置进行部署&#xff0c;例如接下来会提到的服务初始化、日志管理和数据分盘等关键步骤。而在非生产环境中&#xff0c;如果条件满足&#xff0c;同样建议遵循规范部署的原则。 前期准备…

项目实战-开发工具入门/基本框架搭建/项目初始化/引入组件库

上周更新完了之前vue3的shopping项目&#xff0c;接下来&#xff0c;将会开启一个新的项目&#xff0c;效果是类似于移动端的一个伙伴匹配项目&#xff0c;今天这篇文章从需求分析到架构设计再到项目初始化&#xff0c;基本框架搭建几个部分来为大家详细介绍。 从这个项目开始…

YOLOV5 改进:替换backbone为Swin Transformer

1、前言 本文会将YOLOV5 backbone更换成Swin Transformer 具体为什么这样实现参考上文:YOLOV5 改进:替换backbone(MobileNet为例)-CSDN博客 这里只贴加入的代码 训练结果如下: 2、common文件更改 在common文件中加入下面代码: 这里是swin transformer的实现,参考:…

VMware部署银河麒麟遇到的问题记录

1. 解决VMware Workstation安装VMware Tools显示灰色的办法 1.关闭虚拟机; 2.在虚拟机设置分别设置CD/DVD、CD/DVD2和软盘为自动检测三个步骤; 3.再重启虚拟机,灰色字即点亮。 2.Linux安装vmTool

Pytest接口自动化测试框架搭建模板

auto_api_test 开发环境: Pycharm 开发语言&版本: python3.7.8 测试框架: Pytest、测试报告: Allure 项目源码Git地址 项目目录结构 api – 模仿PO模式, 抽象出页面类, 页面类内包含页面所包含所有接口, 并封装成方法可供其他模块直接调用config – 配置文件目录data…

打造高效自动化渗透测试系统:关键步骤与实践

随着当前网络安全威胁的不断扩展与升级&#xff0c;开展渗透测试工作已经成为广大企业组织主动识别安全漏洞与潜在风险的关键过程。然而&#xff0c;传统的人工渗透测试模式对测试人员的专业能力和经验水平有很高的要求&#xff0c;企业需要投入较大的时间和资源才能完成。在此…

品牌纷纷推出“穷鬼套餐”的原因竟然有这些?

被大众戏称为“千元店”的山姆也开穷鬼套餐了&#xff1f;&#xff1f;该套餐包括1.59公斤售价21.9元的鸡蛋、7个装售价23.9元的原味贝果以及16片装售价59.8元的瑞士卷。 穷鬼套餐最开始是麦当劳和肯德基的推出的概念&#xff0c;由麦当劳推出的11随心配、肯德基超值午餐等。为…

python(django)之产品后台管理功能实现

1、添加新项目 在命令行输入以下代码 python manage.py startapp prroduct 2、添加路径和代码结构 在新项目目录下admin.py中加入以代码 from .models import Product class ProductAdmin(admin.ModelAdmin):list_display [product_name, product_desc,producter,created_…

CC-DefineTag:一个简单好用的标签组件,支持自动换行、自适应高度,且可设置行数、标签文字颜色等属性

CC-DefineTag&#xff1a;一个简单好用的标签组件&#xff0c;支持自动换行、自适应高度&#xff0c;且可设置行数、标签文字颜色等属性 摘要&#xff1a; 在前端开发中&#xff0c;标签组件是常见的UI组件之一&#xff0c;用于显示一组相关的标签。然而&#xff0c;传统的标签…

Postman Runner 使用指南

什么是 Postman Runner&#xff1f; 而 Postman Runner 是 Postman 中的一个模块&#xff0c;它提供了一种批量运行 API 请求的方式&#xff0c;这些请求可以是已经保存的历史请求、集合中的请求或者手动添加的请求。在批量运行 API 请求的过程中&#xff0c;Postman Runner 可…

4.1 用源文件写汇编代码

汇编语言 1. 源程序 1.1 伪指令 汇编指令是有对应的机器码的指令&#xff0c;可以被编译为机器指令&#xff0c;最终为CPU所执行伪指令没有对应的机器指令&#xff0c;最终不被CPU所执行伪指令是由编译器来执行的指令&#xff0c;编译器根据伪指令来进行相关的编译工作 1.2…

arm-linux实现onvif server+WS-UsernameToken令牌验证

目录 一、环境搭建 1、安装openssl 2、安装bison 3、安装flex 二、gsoap下载 三、编译x86版本gsoap 四、编译arm-linux版本gsoap 1、交叉编译openssl 1.1、下载openssl 1.2、交叉编译 2、交叉编译zlib 2.1、下载zlib 2.2、交叉编译 3、交叉编译gsoap 3.1、编译过…