哈希码相同只表示对象被分配到同一桶中,并不意味着内容相等;真正判断相等的是equals方法,hashcode仅用于快速定位桶并提升查找效率。

因为哈希码只是对象的“快速指纹”,不是唯一身份标识。相同哈希码只说明两个对象被分配到了哈希表的同一个桶(bucket)里,但桶里可以放多个对象——这叫哈希冲突,是正常且不可避免的现象。
哈希冲突是设计使然,不是 bug
Java 的哈希表(如 HashMap、HashSet)底层用的是有限数量的数组槽位(比如 16 或 64 个)。而对象可能成千上万,哈希码虽是 int(2³² 种取值),但实际槽位远少于这个数。所以不同对象算出相同哈希码,完全合理。
- 例如:Person("张三", 25) 和 Person("李四", 30),若 hashCode 只基于姓名长度计算,都返回 2,但内容显然不等
- 再如:String "FB" 和 "Ea" 在 JDK 8 中 hashCode 都是 2234,但 equals 返回 false
equals 才是真正的相等判断
hashCode 的作用是缩小查找范围:先用 hash 快速定位到桶,再在桶内用 equals 逐个比对。它不负责最终裁决,只负责“初筛”。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 如果 hashCode 不同 → 直接判定不等(跳过 equals,提升性能)
- 如果 hashCode 相同 → 必须调用 equals 进一步确认(避免误判)
不重写 hashCode 会破坏集合行为
当你自定义类并重写了 equals(比如按业务字段判断相等),却没重写 hashCode,就会出现逻辑矛盾:
- 两个内容相同的对象,equals 返回 true,但 hashCode 可能不同(因继承 Object 默认实现,基于内存地址)
- 结果:它们可能被存入 HashMap 的不同桶中,导致 get() 查不到、contains() 返回 false、HashSet 重复添加
本质上,hashCode 相同 ≠ 内容相同;它只是“值得你花力气再仔细看看”的信号。真正拍板的,永远是 equals。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










