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

有帮助吗?

解决方案

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

其他提示

约书亚布洛赫勾画出如何正确重写equals和hashCode在 “有效的Java” 的第3章

乘法,添加或异或事情不会使它更独特。在数学上,你会施加恒定的功能到单个可变,这不增加变量的可能值的数目。

那种技术的是组合多个散列码和仍然保持碰撞相对小的风险有用;它没有任何轴承在单个哈希码。

是啊,这是相当标准。如果该类反映一个数据库行,我只是返回的主键。

有只有两个hashCode真实要求:一个,那equals实例具有相等的哈希码,以及两个,即hashCode运行相当快。第一个要求是在实践中最重要的一个;没有它,你可以把东西放到一个集合,但未能找到它。第二是一个简单的性能问题。

如果您的字段的哈希码算法符合上述情况,那么它的算法也适用于你的类,如果你的类equals也完全取决于这些字段是否equals

如果“fieldMember”变量已经实现了“的hashCode”功能,那么你可以直接从父类中使用它。如果“fieldMember”变量是一个自定义的类的实例,那么你必须正确地实现它自己。阅读 java.lang.Object继承 API文档作为准则来实现 '的hashCode'。

雅。这是良好的编程习惯。我通常使用:

返回变种^ 1;

通常,除非你正使用该对象作为密钥用于* HashMap中或在*的HashSet的元素,hashCode()方法不需要被重写。

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

为了简化编写好的 equals() 和 hashCode() 方法,我使用 等于生成器哈希码生成器 来自 Apache Commons Lang

以下是示例:

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();
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top