题
我有一个非常简单的课程,只有一名现场成员(例如细绳)。是否可以实施 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();
}