首页/新闻资讯/正文详情

Java中关于HashSet常见问题

发布时间:2026/11/6 6:19:11 来源:云帆数科 栏目:资讯中心
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()相同不代表对象相同。

相关推荐

ego-lite:共享登录态的 AI Agent 浏览器,复杂网页任务免费跑快 2.5 倍
ego-lite:共享登录态的 AI Agent 浏览器,复杂网页任务免费跑快 2.5 倍

ego-lite:共享登录态的 AI Agent 浏览器,复杂网页任务免费跑快 2.5 倍 【免费下载链接】ego-lite The fastest browser for AI agents to run browser automation, built for sharing your logged-in browser state with your AI agents, like Codex or … · 2026/11/6 6:19:11

Docker + IDEA 一键部署!
Docker + IDEA 一键部署!

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

Mars 踩坑实录:Android 2.1 缺 Object.keys 时的两行 for-in 替代写法
Mars 踩坑实录:Android 2.1 缺 Object.keys 时的两行 for-in 替代写法

Mars 踩坑实录:Android 2.1 缺 Object.keys 时的两行 for-in 替代写法 【免费下载链接】Mars 腾讯移动 Web 前端知识库 项目地址: https://gitcode.com/gh_mirrors/mar/Mars 维护低版本 Android 页面的人,大概率撞见过这样一个报错:An… · 2026/11/6 6:18:11

存算分离架构在金融风控中的实践与优化
存算分离架构在金融风控中的实践与优化

1. 项目背景与行业痛点在数据量爆炸式增长的今天,传统大数据架构的存储与计算耦合设计正面临严峻挑战。我们团队去年处理的一个金融风控项目,单日新增数据量就达到1.2TB,这种规模下传统Hadoop架构的扩容成本呈指数级上升。存算分离架构通过将… · 2026/11/6 7:16:27

Spark电商大数据分析实战:从采集到预测全流程
Spark电商大数据分析实战:从采集到预测全流程

1. 项目概述:电商大数据分析实战这个基于Spark的淘宝商品数据分析系统,是我去年指导某高校计算机专业毕业设计的实战项目。它完整覆盖了从数据采集到预测分析的全流程,特别适合需要做大数据相关毕业设计的同学参考。系统采用HadoopSpark技术栈… · 2026/11/6 7:16:27

钓鱼攻击技术演进与防御实战指南
钓鱼攻击技术演进与防御实战指南

1. 钓鱼攻击激增现象解析最近安全圈里有个让人睡不着觉的数据——黑色星期五购物季前夕,全球钓鱼攻击量同比激增620%。这个数字不是来自某个安全厂商的危言耸听,而是综合了37家企业的安全日志得出的结论。我昨晚分析了几十个最新钓鱼样本,发现… · 2026/11/6 7:16:27

PostgreSQL数字类型详解与最佳实践
PostgreSQL数字类型详解与最佳实践

1. PostgreSQL数字类型概述PostgreSQL作为一款功能强大的开源关系型数据库,其数据类型系统设计得尤为精细。数字类型作为数据库中最基础也最常用的数据类型之一,在PostgreSQL中被划分为多个子类,每种类型都有其特定的存储格式、精度范围和适用… · 2026/11/6 7:16:27

CTF竞赛中的开源情报(OSINT)实战技巧
CTF竞赛中的开源情报(OSINT)实战技巧

1. CTF竞赛中的开源情报方法论在网络安全竞赛领域,开源情报(OSINT)已成为解题的关键突破口。去年某次赛事中,我们团队通过分析公开的GitHub代码库,发现参赛队伍遗留的数据库凭证,最终逆向定位到目标系统的管理后台。这种通过公开资… · 2026/11/6 7:16:27

2007年DDoS攻击流量数据集:获取门槛、替代方案与pcap特征提取
2007年DDoS攻击流量数据集:获取门槛、替代方案与pcap特征提取

每隔一段时间,技术群里就会冒出几乎一字不差的求助:跪求某公开网络测量组织 2007 年发布的那套 DDoS 攻击流量数据集,谁有网盘链接。发帖的人多半是在做入侵检测、异常流量识别或者毕业设计,卡在数据这一环,模型代码写… · 2026/11/6 7:15:27

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* 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 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* 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 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* 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 10:28:07

三菱PLC数据采集到数据库的时序设计:Python+MC协议实战
三菱PLC数据采集到数据库的时序设计:Python+MC协议实战

/* 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:02:11

ASIC主模式RTL设计:状态机与三态驱动的流片级实现
ASIC主模式RTL设计:状态机与三态驱动的流片级实现

/* 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:02:11

STM32嵌入式C++开发:GDB调试与Renode仿真实战指南
STM32嵌入式C++开发:GDB调试与Renode仿真实战指南

/* 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:02:11

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* 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 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* 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 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* 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 10:28:07

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码