Java中关于HashSet常见问题

发布时间:2026/11/6 6:19:25

Java中关于HashSet常见问题 为什么两个 id 相同的 User能同时放进 HashSet先看一个常见问题User u1 new User(1, 张三); User u2 new User(1, 张三); SetUser set new HashSet(); set.add(u1); set.add(u2); System.out.println(set.size()); // 可能是 2明明是同一个人为什么没去重问题通常不在 Set而在 User 类只重写了hashCode()没重写equals()。一、Set 是怎么去重的Set 不允许重复元素但它不是一个个跟所有元素比那样太慢。它靠两步先用hashCode()算出位置再用equals()判断是不是真的重复。往 HashSet 里加元素时算出hashCode()找到对应位置位置是空的直接放位置有元素就用equals()比一下equals()返回true说明重复不添加equals()返回false说明不重复添加。一句话hashCode()负责快速找位置equals()负责最后确认是不是重复。二、为什么重写hashCode()必须重写equals()因为这两个方法要配合工作。如果只重写hashCode()不重写equals()equals()用的还是默认实现比较的是对象地址。于是u1和u2的 id 相同hashCode()相同会落到同一个位置但它们是两个不同对象默认equals()返回falseSet 认为它们不重复于是两个都存进去。结果就是id 相同的对象没能去重。在 HashMap 里也一样它们会被当成两个不同的 key。所以结论很简单重写hashCode()时要一起重写equals()并且用同一批字段来判断。三、哈希冲突是什么哈希函数是把很多输入映射到有限的位置上。位置只有那么多对象却可以有很多所以不同对象算出同一个哈希值很正常。这就是哈希冲突。冲突无法完全避免只能尽量分散。HashMap 和 HashSet 处理冲突的方式就是同一个位置挂链表链表太长再转红黑树。所以hashCode()相同不代表一定是同一个对象最后还要靠equals()确认。四、记住三句话Set 去重靠两步hashCode()定位equals()确认。重写hashCode()就要重写equals()两者逻辑要一致。哈希冲突是正常现象hashCode()相同不代表对象相同。
延伸阅读

更多相关文章

2026/11/6 6:19:25

Docker + IDEA 一键部署!

Docker IDEA 一键部署! 作为 3 Year全栈开发者相比对Docker一定很熟悉,镜像容器化技术,就不过多介绍了! 很久之前做的 Docker 入门学习Blog ,现在回头看发现有点过于臃肿,后期会总结一套常用命令&#x…

2026/11/6 7:19:28

课程文档批量下载器:登录态、递归枚举与增量同步

简介:BlackboardDownloader 是一个面向使用 Blackboard 教学平台的高校师生与教研人员的批量资源抓取工具,它用 Java 编写,解决课程资料分散在多个栏目、逐一手动下载费时费力的问题。程序运行后会提示输入平台账号与密码,登录后遍…

2026/11/6 7:19:28

AI Agent系统高可用设计与错误处理实战

1. 高可用Agent系统的核心挑战在AI应用开发领域,构建具备高可用性的Agent系统是每个开发者必须面对的课题。我经历过多个AI项目的完整生命周期,最深刻的体会是:系统在测试环境运行良好只是起点,真正的考验在于异常场景下的表现。当…

2026/11/6 7:19:28

C语言解析VPK资源包:VPKTool内存索引与零拷贝读取

简介:VPKTool 是一套面向 C 语言开发者、专注 Valve Package(VPK)打包格式解析与生成的轻量级库与命令行工具,适合基于 Valve 引擎(如《反恐精英:全球攻势》《半条命2》)做资源管理、MOD 开发或…

2026/11/6 7:19:28

VST 3 SDK音频插件工程化:从DSP到宿主加载与跨平台打包

简介:这份VST 3插件SDK资料面向音频插件开发者、DAW扩展开发者及音效/乐器插件学习者,聚焦Windows、macOS、Linux与iOS多平台下的VST 3接口理解、工程组织与构建准备。压缩包共7个文件,约405KB,以2个PDF、2个TXT、1个Markdown及HT…

2026/11/6 7:19:28

MFC GDI绘制柱状图:CDC画刷、坐标映射与双缓冲刷新

简介:这份面向 MFC 初学者的柱状图绘制示例,围绕单文档界面下的 GDI 绘图展开,重点演示 CBrush 画刷设置、CPaintDC 设备上下文选入、矩形柱体填充,以及从 TXT 文档读取数据并动态更新的基本流程,适合正在学习 Windows…

2026/11/6 7:14:28

Docker容器化技术:从原理到实践部署指南

1. Docker容器化技术概述容器化技术正在彻底改变现代应用的部署方式。作为一名长期从事系统运维的工程师,我见证了从传统虚拟机到容器技术的演进过程。Docker作为当前最流行的容器引擎,其核心价值在于提供轻量级、标准化的应用打包与运行环境。与虚拟机相…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/6 1:03:39

MCU晶振电路设计全解析:从负载电容计算到PCB布局调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑