当我从 Object 类覆盖 equals() 时,我如何实现哈希代码()



在java PMD规则中,有一个规则OverrideBothEqualsAndHashcode。

这意味着开发人员必须覆盖 equals(Object obj( 和 hashCode(( 而不仅仅是一个。

有人可以解释为什么吗?

如果我覆盖并重新定义 eqauls(Object obj(,我应该在 hashCode(( 中实现什么?

class MyClass() {
    public int id;
    @Override
    public boolean equals(Object obj) {
        return id == ((MyClass) obj).id;
    }
    @Override
    public int hashCode() {
        // WHAT KIND OF CODE SHOULD I IMPLEMENT HERE?
    }
}

如果你覆盖equals,你必须覆盖hashCode,因为hashCode的契约要求相等的对象具有相同的hashCode

至于您的特定示例的hashCode实现,这很简单。由于您的相等性由单个int实例变量确定,因此hashCode应该只返回该变量。

这为您提供了最佳的hashCode实现 - 不相等的MyClass实例永远不会具有相同的hashCode

@Override
public int hashCode() {
    return id;
}

最新更新