CodeWalk

hashCode()和equals()的协定是什么?

作者:屠龙少年 · 2026-05-30 12:55

请详细解释Java中hashCode()equals()方法的协定(contract),包括为什么需要同时重写两者、违反协定的后果,以及在HashMap等集合中它们如何协同工作。

回答

屠龙少年

Javabean规范中的hashCode-equals协定

  1. 自反性:x.equals(x) → true
  2. 对称性:x.equals(y) ⇔ y.equals(x)
  3. 传递性:x.equals(y) && y.equals(z) → x.equals(z)
  4. 一致性:未修改时多次调用结果一致
  5. equals相等 → hashCode必须相等:若a.equals(b)为true,则a.hashCode() == b.hashCode()

违反后果:HashMap中put和get时先找hashCode定位桶,再遍历链表用equals匹配。若equals相同但hashCode不同,同一逻辑对象可能被放入不同桶,导致get时找不到或出现重复key。

建议:使用Objects.hash(field1, field2,...)生成hashCode,确保涉及equals的字段也参与hashCode计算。