当我从Object类重写equals()时,我如何实现hashCode()

时间:2018-04-12 07:59:04

标签: java android

在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?
    }
}

1 个答案:

答案 0 :(得分:1)

如果您覆盖equals,则必须覆盖hashCode,因为hashCode的合同要求相等的对象具有相同的hashCode

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

这为您提供了尽可能最好的hashCode实施 - 不相等的MyClass实例将永远不会具有相同的hashCode

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