Java 中 ConcurrentHashMap 和 HashMap 能存 null 吗?深挖原理和使用场景

前言

当你使用 HashMapConcurrentHashMap 时,可能会冒出一个经典问题:它们能存储 null 键或 null 值吗? 初学者可能觉得无所谓,试一下不就知道了,但在真实项目中,这个问题可能导致严重的 bug。今天我们就来系统讲解这两个常用集合类对 null 键和值的支持情况,并深入分析其设计背后的逻辑。


一、结论先行

集合类型是否允许 null是否允许 null
HashMap允许允许
ConcurrentHashMap不允许不允许

简单来说:

  • HashMap:对 null 键和 null 值都很包容。
  • ConcurrentHashMap:对 null 直接说“不”。

接下来我们看看这些行为的原因和实现细节。


二、HashMap 的行为分析

1. 支持 null 键和 null

HashMap 是 Java 中最常用的非线程安全集合,它允许存储一个 null 键和多个 null 值。

示例:

import java.util.HashMap;public class HashMapNullExample {public static void main(String[] args) {HashMap<String, String> map = new HashMap<>();map.put(null, "这是一个 null 键");map.put("key1", null);map.put("key2", null);System.out.println("HashMap: " + map);}
}

输出:

HashMap: {null=这是一个 null 键, key1=null, key2=null}
2. 为什么允许 null
  • null 键:

    • HashMap 的实现中,null 键被特殊处理。如果键是 null,则会直接存储到 table 的第一个桶(table[0])中,而不需要计算哈希值。

    • 源码片段(Java 8

      put
      

      方法):

      if (key == null)return putForNullKey(value);
      
  • null 值:

    • HashMap 没有对值进行特殊约束,只要键有效,值就可以为 null

三、ConcurrentHashMap 的行为分析

1. 不支持 null 键和 null

ConcurrentHashMap 是线程安全的 Map,它对 null 键和值都不友好,如果尝试存储 null,会直接抛出 NullPointerException

示例:

import java.util.concurrent.ConcurrentHashMap;public class ConcurrentHashMapNullExample {public static void main(String[] args) {ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();// 测试 null 键try {map.put(null, "null 键");} catch (NullPointerException e) {System.out.println("不支持 null 键: " + e);}// 测试 null 值try {map.put("key1", null);} catch (NullPointerException e) {System.out.println("不支持 null 值: " + e);}}
}

输出:

不支持 null 键: java.lang.NullPointerException
不支持 null 值: java.lang.NullPointerException
2. 为什么不允许 null
  • 线程安全性考虑:

    ConcurrentHashMap
    

    是为高并发设计的,

    null
    

    键或值可能会导致难以调试的空指针问题。例如:

    • 如果 get(key) 返回 null,你无法确定是因为键不存在,还是值本身就是 null
    • 在多线程场景中,null 键或值的存在可能会导致更复杂的边界条件和线程安全问题。
    • ConcurrentHashMap 的设计原则是:尽量避免模棱两可的行为,让开发者在代码中明确处理空值逻辑。

四、背后的设计哲学

1. HashMap 的包容性

HashMap 是单线程的,设计上更加灵活,主要用于非并发场景。允许 null 键和值,符合它“工具箱”式的轻量设计。

2. ConcurrentHashMap 的严格性

ConcurrentHashMap 强调高效和安全,它的限制(不允许 null)是为了防止并发场景中的潜在问题,并帮助开发者写出更清晰的代码。


五、常见误区

误区 1:ConcurrentHashMap 支持 null 键和值

很多初学者以为所有的 Map 实现都支持 null 键和值,实际并非如此。记住:ConcurrentHashMapnull 说“不”!

误区 2:HashMap 中多个 null 键是可以的

HashMap 中最多只能有一个 null 键,多个 null 键会导致覆盖。

示例:

HashMap<String, String> map = new HashMap<>();
map.put(null, "值1");
map.put(null, "值2");
System.out.println(map); // 输出: {null=值2}

六、如何优雅处理 null

1. 使用 Optional 替代 null

在需要明确区分值是否为空时,可以使用 Optional 来代替 null

import java.util.Optional;HashMap<String, Optional<String>> map = new HashMap<>();
map.put("key1", Optional.ofNullable(null));
System.out.println(map.get("key1").orElse("默认值"));
2. 初始化 Map 时确保没有 null 键和值

对于不允许存储 null 的 Map(如 ConcurrentHashMap),需要手动检查输入:

if (key == null || value == null) {throw new IllegalArgumentException("键和值均不能为空");
}

七、总结

特性HashMapConcurrentHashMap
允许 null
允许 null
线程安全性
典型使用场景单线程、灵活性需求高多线程、高并发环境

记住这些差异,你就能在项目中更高效地选择合适的 Map 类型。如果你有任何疑问,欢迎留言一起探讨! 😊

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

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

相关文章

0101多级nginx代理websocket配置-nginx-web服务器

1. 前言 项目一些信息需要通过站内信主动推动给用户&#xff0c;使用websocket。web服务器选用nginx&#xff0c;但是域名是以前通过阿里云申请的&#xff0c;解析ip也是阿里云的服务器&#xff0c;甲方不希望更换域名。新的系统需要部署在内网服务器&#xff0c;简单拓扑图如…

Everything实现,快速搜索文件

最近编写NTFS文件实时搜索工具, 类似 Everything 这样, 翻阅了很多博客, 结果大致如下: 1.分析比较肤浅, 采用USN日志枚举来获取文件记录 速度一言难尽, 因为日志枚举的是全盘所有文件的所有日志, 记录比文件记录还多, 速度当然很慢, 还有的甚至于是 使用 DeviceIoControl 函数…

京东大数据治理探索与实践 | 京东零售技术实践

01背景和方案 在当今的数据驱动时代&#xff0c;数据作为关键生产要素之一&#xff0c;其在商业活动中的战略价值愈加凸显&#xff0c;京东也不例外。 作为国内领先的电商平台&#xff0c;京东在数据基础设施上的投入极为巨大&#xff0c;涵盖数万台服务器、数 EB 级存储、数百…

nodejs搭配express网站开发后端接口设计需要注意事项

nodejs搭配express网站开发后端接口设计需要注意事项&#xff01;为了回避一些常见的误区&#xff0c;今天和大家汇总一下&#xff0c;最近我遇到的一些错误信息&#xff0c;虽然都是小问题&#xff0c;但是还是需要分享一下&#xff0c;以免大家再次犯错。 1&#xff1a;第一个…

解决vscode ssh远程连接服务器一直卡在下载 vscode server问题

目录 方法1&#xff1a;使用科学上网 方法2&#xff1a;手动下载 方法3 在使用vscode使用ssh远程连接服务器时&#xff0c;一直卡在下载"vscode 服务器"阶段&#xff0c;但MobaXterm可以正常连接服务器&#xff0c;大概率是网络问题&#xff0c;解决方法如下: 方…

Spring Boot实现OAuth2.0登录实战

一、前言 最近在研究Springboot Vue 的前后端分离框架&#xff0c;刚开始做登录功能&#xff0c;做着做着觉得普通账户密码登录太简单了&#xff0c;决定再加上 GitHub授权 和 人脸识别等多种快捷登录方式。 而GitHub授权登录正好用到了OAuth2.0中最复杂的授权码模式&#xf…

电脑开机提示error loading operating system怎么修复?

前一天电脑还能正常运行&#xff0c;但今天启动时却显示“Error loading operating system”&#xff08;加载操作系统错误&#xff09;。我已经仔细检查了硬盘、接线、内存、CPU和电源&#xff0c;确认这些硬件都没有问题。硬盘在其他电脑上可以正常使用&#xff0c;说明不是硬…

Java web的发展历史

目录 前言&#xff1a; 一.Model I和Model II 1.Model I开发模式 ​编辑 2.Model II开发模式 二. MVC模式 前言&#xff1a; 该篇文章主要介绍了Java web的发展历史&#xff0c;以及MVC相关内容 一.Model I和Model II 1.Model I开发模式 Model1的开发模式是&#xff…

Intel-ECI之Codesys PLC + Ethercat 远端IO + Codesys IDE编程

目录 一、 准备工作 二、安装Codesys 软件 PLC 三、 使用Codesys IDE 编程测试 CODESYS* 是领先的独立于制造商的 IEC 61131-3 自动化软件&#xff0c;适用于工程控制系统。它用于 Intel Edge Controls for Industrial&#xff08;Intel ECI 或 ECI&#xff09;&#xff0c;…

SQL语句练习

阅读《SQL必知必会》&#xff08;第五版&#xff09;然后结合往常表做的练习记录 这里使用的数据库时sqlite3,使用的工具时navicat 表资源链接https://wenku.baidu.com/view/349fb3639b6648d7c1c74652.html 表录入后如上图所示。后面如果有多张表之间的操作&#xff0c;在引入…

【Python】【数据分析】深入探索 Python 数据可视化:Seaborn 可视化库详解

目录 引言一、Seaborn 简介二、安装 Seaborn三、Seaborn 的基本图形3.1 散点图&#xff08;Scatter Plot&#xff09;3.2 线图&#xff08;Line Plot&#xff09;3.3 条形图&#xff08;Bar Plot&#xff09;3.4 箱型图&#xff08;Box Plot&#xff09;3.5 小提琴图&#xff0…

input输入框的placeholder颜色修改(Shadow DOM)

placeholder颜色修改 使用参考说明 https://zh.javascript.info/shadow-dom 查看shadow tree的方法

uniApp使用腾讯地图提示未添加maps模块

uniApp使用腾讯地图&#xff0c;打包提示未添加maps模块解决方案 这是报错信息&#xff0c;在标准基座运行的时候是没问题的&#xff0c;但是打包后会提示未添加&#xff0c;可以通过在mainfest里面把地图插件上腾讯地图的key更换高德地图的key&#xff0c;定位服务可以继续用腾…

linux------vim命令

一、基本模式切换 普通模式&#xff08;Normal Mode&#xff09; 当你打开Vim时&#xff0c;默认进入普通模式。在这个模式下&#xff0c;可以使用各种命令来移动光标、删除文本、复制粘贴等操作。例如&#xff0c;使用h、j、k、l来移动光标。h是向左移动一个字符&#xff0c;j…

数据可视化-2. 条形图

目录 1. 条形图适用场景分析 1.1 比较不同类别的数据 1.2 展示数据分布 1.3 强调特定数据点 1.4 展示时间序列数据的对比 1.5 数据可视化教育 1.6 特定领域的应用 2. 条形图局限性 3. 条形图图代码实现 3.1 Python 源代码 3.2 条形图效果&#xff08;网页显示&#…

2023年下半年软考信息安全工程师案例分析及答案解析

试题一(16分) 回答问题1至问题6,将解答填入答题纸对应的解答栏内。 问题1(4分) 已知DES算法S盒如下,请补全S盒空缺的数据(1)、(2)、(3)、(4)。 【参考答案】3、13、15、0 问题2(2分) 已知S盒的输入为110011,请计算经过S盒变换之后的二进制输出。 【参考…

模型部署学习笔记——模型部署关键知识点总结

模型部署学习笔记——模型部署关键知识点总结 模型部署学习笔记——模型部署关键知识点总结1. CUDA中Grid和Block的定义是什么&#xff1f;Shared Memory的定义&#xff1f;Bank Conflict的定义&#xff1f;Stream和Event的定义&#xff1f;2. TensorRT的工作流程&#xff1f;3…

Spring Cloud Gateway 源码

Spring Cloud Gateway 架构图 按照以上架构图&#xff0c;请求的处理流程&#xff1a; 1.客户端请求发送到网关 DispatcherHandler 2.网关通过 HandlerMapping 找到相应的 WebHandler 3.WebHandler生成FilterChain过滤器链执行所有的过滤器 4.返回Response结果 自动装配类Gat…

基于Spring Boot的店铺租赁平台的设计与实现

一、项目背景 随着互联网技术的飞速发展&#xff0c;线上交易已成为商业活动的重要趋势。店铺租赁作为商业地产的核心环节&#xff0c;其传统模式面临着信息不对称、交易效率低下等问题。因此&#xff0c;开发一个高效、便捷的线上店铺租赁平台显得尤为重要。本项目利用Java S…

基于卷积神经网络(CNN)和ResNet50的水果与蔬菜图像分类系统

前言 在现代智能生活中&#xff0c;计算机视觉技术已经成为不可或缺的工具&#xff0c;特别是在食物识别领域。想象一下&#xff0c;您只需拍摄一张水果或蔬菜的照片&#xff0c;系统就能自动识别其种类并为您提供丰富的食谱建议。这项技术不仅在日常生活中极具实用性&#xf…