当前位置: 首页 > news >正文

hashmap和concurrentHashmap是否允许null值和null健

文章目录

      • 一、HashMap 对 null 的支持
        • 示例:
      • 二、ConcurrentHashMap 对 null 的支持
        • 原因:
        • 示例:
      • 三、总结对比

在 Java 中,HashMapConcurrentHashMapnull 键(key)和 null 值(value)的支持存在显著差异,这与它们的设计目标(单线程 vs 多线程安全)直接相关:

一、HashMap 对 null 的支持

HashMap 允许 null 键和 null 值,具体规则如下:

  • null 键:整个 HashMap 中只能有一个 null 键(因为键是唯一的),它会被特殊处理并存储在哈希表的第 0 个桶(bucket)中。
  • null 值:可以有多个 null 值(只要对应的键不同)。
示例:
HashMap<String, String> map = new HashMap<>();
map.put(null, "value1"); // 允许 null 键
map.put("key2", null);   // 允许 null 值
map.put(null, "value3"); // 覆盖之前的 null 键对应的值System.out.println(map.get(null)); // 输出 "value3"(覆盖后的值)
System.out.println(map.get("key2")); // 输出 null

二、ConcurrentHashMap 对 null 的支持

ConcurrentHashMap 不允许 null 键和 null 值,无论是键还是值为 null,都会抛出 NullPointerException

原因:

ConcurrentHashMap 设计用于多线程并发场景,需要通过返回值判断操作结果(如 get(key) 方法)。如果允许 null 值,当方法返回 null 时,无法区分“键不存在”和“键存在但值为 null”,可能导致并发场景下的逻辑错误。

示例:
ConcurrentHashMap<String, String> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put(null, "value"); // 抛出 NullPointerException
concurrentMap.put("key", null);   // 抛出 NullPointerException

三、总结对比

集合类是否允许 null 键是否允许 null 值核心原因
HashMap允许(仅一个)允许(多个)单线程场景,无需处理并发歧义
ConcurrentHashMap不允许不允许多线程场景,避免返回值歧义

实际开发中,若需在并发场景中使用类似“空值”的标记,可使用一个特殊的占位符对象(如 new Object())替代 null,避免 NullPointerException

http://www.dtcms.com/a/331203.html

相关文章:

  • PiscCode使用光流法计算漂浮物位移速度
  • 把 AI 推理塞进「 8 位 MCU 」——0.5 KB RAM 跑通关键词唤醒的魔幻之旅
  • 监控插件SkyWalking(一)原理
  • 嵌入式学习的第四十九天-时钟+EPIT+GPT定时器
  • 无人机探测器技术解析
  • 阿里巴巴 Qwen-Image:免费开源,还要挑战 GPT-4.1 和 Midjourney?
  • 恢复GPT-4o,增加付费配额:OpenAI的“补救措施”如何重塑用户金字塔
  • OpenCV ------图像基础处理(一)
  • 【OpenCV】Mat详解
  • 论,物联网日志系统架构如何设计?
  • AI增强SEO关键词表现
  • Postman 平替 技术解析:架构优势与实战指南
  • 审批流程系统设计与实现:状态驱动、灵活扩展的企业级解决方案
  • Java研学-RabbitMQ(八)
  • Rabbitmq+STS+discovery_k8s +localpv部署排坑详解
  • 队列的使用以及泛型思考[二叉树的层序遍历]
  • 【P27 4-8】OpenCV Python——Mat类、深拷贝(clone、copyTo、copy)、浅拷贝,原理讲解与示例代码
  • Horse3D游戏引擎研发笔记(五):在QtOpenGL环境下,仿three.js的BufferGeometry管理VAO和EBO绘制四边形
  • 算法训练营day51 图论② 岛屿数量深搜、广搜、最大面积
  • 图论(5)最小生成树算法
  • Claude Code 国内直接使用,原生支持 Windows 免WSL安装教程
  • Day56--图论--108. 冗余的边(卡码网),109. 冗余的边II(卡码网)
  • Day58--图论--117. 软件构建(卡码网),47. 参加科学大会(卡码网)
  • MySQL窗口函数与PyMySQL以及SQL注入
  • MySQLl中OFFSET 的使用方法
  • 中国AI生态加速迭代,AI硬件引领人机互动新范式
  • LeetCode 分类刷题:2302. 统计得分小于 K 的子数组数目
  • Gradle(四)Maven 项目迁移 Gradle 项目实践
  • 文件服务器:samba
  • Java 并发新范式:用 Structured Concurrency 优雅收拾多线程烂摊子