讲师中心 微信公众号
AI工具推荐 视频效率加速

Java Map键冲突时如何覆盖_覆盖写入规则说明

小宇大大_7540

小宇大大_7540

发布时间:2025-12-18 09:04:50

|

723人浏览过

|

来源于php中文网

原创

Map 中键相同时默认覆盖旧值,不报错;前提是 key 的 hashCode() 相同且 equals() 返回 true;自定义 key 需重写二者;put() 无条件覆盖,putIfAbsent() 仅新增;ConcurrentHashMap 的 put() 同样覆盖且线程安全。

java map键冲突时如何覆盖_覆盖写入规则说明

Java 中的 Map(如 HashMap、TreeMap)在键(key)相同时,默认行为就是覆盖旧值,不是报错或拒绝写入。这是 Map 接口的核心语义之一,无需额外配置。

覆盖发生的前提:键的 equals() 和 hashCode() 一致

Map 判断“键冲突”依赖两个方法:

  • hashCode() 决定该 key 存放在哪个桶(bucket)中
  • equals() 在同一个桶内逐个比对,确认是否为同一 key

只有当新 key 与已有 key 的 hashCode() 相同 且 equals() 返回 true 时,才会触发覆盖。例如:

Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("a", 2); // ✅ 覆盖:String 的 equals 和 hashCode 已正确定义

自定义对象作 key 时必须重写 equals() 和 hashCode()

若用自定义类(如 User)作 key,但没重写 equals() 和 hashCode(),默认使用 Object 的实现(基于内存地址),会导致:

立即学习“Java免费学习笔记(深入)”;

  • 两个逻辑相同的对象(如 id 都是 100)被视为不同 key
  • 重复插入,不覆盖,Map 大小异常增长

✅ 正确做法:用 IDE 自动生成或手动确保两者逻辑一致(通常都基于相同字段,如 id)。

deep-java-review
deep-java-review

Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...

下载

put() 是覆盖,putIfAbsent() 是非覆盖写入

Java 提供了两种典型写入方式:

  • map.put(key, value):无条件覆盖(有则更新,无则新增)
  • map.putIfAbsent(key, value):仅当 key 不存在时才插入,存在则跳过(不覆盖)

例如统计词频时常用 put();初始化缓存时常用 putIfAbsent() 避免重复计算。

ConcurrentHashMap 的 put() 也覆盖,但线程安全

多线程环境下,ConcurrentHashMap 的 put() 同样覆盖旧值,且整个操作是原子的。它不会因并发导致数据错乱或丢失更新(不像非线程安全的 HashMap 可能引发死循环等问题)。

注意:compute()、merge() 等方法也遵循覆盖逻辑,只是提供了更灵活的更新策略(比如基于旧值计算新值)。

基本上就这些。覆盖是 Map 的默认契约,关键在于理解 key 的判定逻辑,并在自定义类型中正确实现 equals/hashCode。

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3068

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4369

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3689

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

386

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

3638

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

1029

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

363

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

519

2026.01.21

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

0

2026.09.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn