public lass A {
private String id;
private String attr1;
private String attr2;
@Override
public boolean equals(Object obj) {
if (!(obj instanceof A))
return false;
A a = (A) obj;
return new EqualsBuilder()
.append(id, a.id)
.append(attr1, a.attr1
.append(attr2, a.attr2)
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(id)
.hashCode();
}
}
在示例类中,id应该是hashcode()正常工作的最终值。
否则,在属性修改导致内存泄漏之后,objet将从集合中消失。
A a = new A();
a.setId("id1");
a.setAttr1("attr1");
a.setAttr2("attr2");
Set set = new HashSet();
set.add(a);
set.contains(a) == true;
a.setId("id2");
set.contains(a) == false;
我遗漏了什么吗?为什么没有在hashcodebuilderjavadoc中声明?
这让我陷入困境,因为我见过太多hashcode和equals在同一组字段上中继的情况。似乎没人想到。。。
@Override
public boolean equals(Object obj) {
if (!(obj instanceof A))
return false;
A a = (A) obj;
return new EqualsBuilder()
.append(id, a.id)
.append(attr1, a.attr1
.append(attr2, a.attr2)
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(id)
.append(attr1)
.append(attr2)
.hashCode();
}
1条答案
按热度按时间zengzsys1#
它记录在object.hashcode javadocs中:
在java应用程序执行期间,每当在同一对象上多次调用hashcode方法时,只要不修改对象的equals比较中使用的信息,hashcode方法就必须始终返回相同的整数。从一个应用程序的一个执行到同一应用程序的另一个执行,这个整数不需要保持一致。
作为final的字段将满足这一点。如果这是不可能的,那么你仍然可以使用它们
hashCode
只要你以后不改变它们的值。