两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

hashCode相同不代表equals一定为true,如"Aa"与"BB"哈希值相同但不相等;而equals为true时hashCode必须相同,这是Object规范要求,确保集合类正常工作。

不对。

hashCode() 相同,equals() 不一定为 true

在 Java 中,两个对象的 hashCode() 相同,并不意味着它们的 equals() 一定返回 true。这是因为 hashCode 的设计允许“哈希冲突”——即不同的对象可能拥有相同的哈希值。

例如:

  • String 对象 "Aa" 和 "BB" 的 hashCode() 是相同的(都是 2112),但它们显然不是相等的对象,equals() 返回 false。
  • hashCode 的取值范围有限(int 类型,最多约 42 亿种值),而对象内容的组合几乎是无限的,因此不同对象产生相同哈希值是不可避免的。

equals() 为 true,则 hashCode() 必须相同

反过来,如果两个对象用 equals() 比较返回 true,那么它们的 hashCode() 必须相等。这是 Object 类规范中明确要求的,否则会导致 HashMap、HashSet 等集合类行为异常。

所以正确的逻辑是:

  • 如果 equals() 返回 true → 那么 hashCode() 必须相同
  • 如果 hashCode() 相同不一定 equals() 为 true

总结

hashCode 相同只是 equals 的必要非充分条件。它用于提高查找效率,但最终判断对象是否相等还是要看 equals 方法。

基本上就这些。