Java 中 equals 与 hashCode 的关系
equals 和 hashCode 是 Java 对象体系里很基础的一组方法。它们平时不显眼,但一旦放进 HashMap、HashSet 这类集合中,就会直接影响对象的查找与去重。
equals 表示逻辑相等
默认情况下,Object.equals 比较的是引用地址。也就是说,只有两个引用指向同一个对象时才返回 true。
很多业务对象需要的是“逻辑相等”。例如两个对象的 id 相同,就可以认为它们表示同一个实体。这时就需要重写 equals。
hashCode 用于快速定位
哈希集合不会一开始就逐个调用 equals。它会先用 hashCode 找到大致位置,再在可能冲突的位置上比较 equals。
因此有一条重要约定:
如果两个对象
equals返回true,它们的hashCode必须相同。
反过来不要求成立。两个对象 hashCode 相同,只代表它们可能落在同一个桶里,不代表它们相等。
常见错误
只重写 equals 不重写 hashCode 是常见错误。对象在普通比较中看起来相等,但放入 HashSet 后可能无法正确去重。
另一个错误是用可变字段计算 hashCode。如果对象加入集合后字段发生变化,它所在的哈希位置可能不再正确,后续查找就会异常。
推荐做法
- 使用不可变或稳定字段参与计算;
equals和hashCode成对重写;- 保持比较逻辑简单;
- 可以借助 IDE 自动生成,但要理解生成逻辑。
小结
equals 决定对象是否逻辑相等,hashCode 决定哈希集合如何快速定位对象。两者配合正确,集合行为才稳定。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 xiaobai050!