为非常简单的类实现`hashCode()`

时间:2009-01-30 19:07:17

标签: java hashcode

我有一个非常简单的类,只有一个字段成员(例如String)。是否可以实施hashCode()来简单地返回fieldMember.hashCode()?或者我应该以某种方式操纵字段的哈希码?另外,如果我应该操纵它,那为什么呢?

9 个答案:

答案 0 :(得分:12)

如果fieldMember是一种唯一识别对象的好方法,我会说是。

答案 1 :(得分:10)

Joshua Bloch阐述了如何在“Effective Java”Chapter 3中正确覆盖equals和hashCode。

答案 2 :(得分:4)

乘法,添加或xor-ing不会使它更独特。在数学上,您将常量函数应用于单个变量,这不会增加变量的可能值的数量。

这种技术对于组合多个哈希码并且仍然保持冲突风险相对较小非常有用;它在单个哈希码上没有任何影响。

答案 3 :(得分:2)

是的,那是非常标准的。如果类反映了数据库行,我只返回主键。

答案 4 :(得分:1)

hashCode只有两个真正的要求:一个equals实例具有相同的哈希码,另外两个hashCode运行速度相当快。第一个要求是实践中最重要的要求;没有它,你可以将一些东西放入一个集合中,但却找不到它。第二个只是性能问题。

如果您的字段的哈希码算法符合上述要求,那么如果您的班级equals也仅依赖于这些字段是否为equals,则其算法也适用于您的班级。

答案 5 :(得分:1)

如果'fieldMember'变量已经实现'hashCode'功能,那么您可以直接从父类使用它。如果'fieldMember'变量是自定义类实例,那么您必须自己正确实现它。阅读java.lang.Object API文档作为实现'hashCode'的指南。

答案 6 :(得分:0)

雅。这是一个很好的编程实践。我通常使用:

return var ^ 1;

答案 7 :(得分:0)

通常,除非您使用此对象作为* HashMap的键或* HashSet中的元素,否则不需要重写hashCode()。

答案 8 :(得分:0)

正如其他人提到的那样,您应该遵循Effective Java中的建议。如果重写hashCode()方法,则还应该重写equals()方法。此外,这两种方法应该是一致的。

为了简化写好的equals()和hashCode()方法,我使用了来自Apache Commons Lang的EqualsBuilderHashCodeBuilder

以下是示例:

public boolean equals(Object o) {
    if (this == o) {
        return true;
    }
    if (o == null || getClass() != o.getClass()) {
        return false;
    }
    User other = (User) o;
    return new EqualsBuilder()
            .append(this.getUniqueId(), other.getUniqueId())
            .isEquals();
}

public int hashCode() {
    return new HashCodeBuilder()
            .append(this.getUniqueId())
            .toHashCode();
}