Java中关于HashSet常见问题

发布时间:2026/11/6 6:19:23
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()相同不代表对象相同。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询