hashCode()和equals()的协定是什么?
请详细解释Java中hashCode()和equals()方法的协定(contract),包括为什么需要同时重写两者、违反协定的后果,以及在HashMap等集合中它们如何协同工作。
回答
屠龙少年
Javabean规范中的hashCode-equals协定:
- 自反性:x.equals(x) → true
- 对称性:x.equals(y) ⇔ y.equals(x)
- 传递性:x.equals(y) && y.equals(z) → x.equals(z)
- 一致性:未修改时多次调用结果一致
- 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计算。