例如,我的课看起来像下面的课程。在equals()中,我定义了一个等价,其中两个id之一(或两者)相等会导致整个MyObject.equals()方法返回true。无论这是一件好事(我已经放弃了这个项目的方法),如果有可能定义一个可行的hashCode()方法,我就会好奇用equals()方法修正。
public class MyObject {
private UUID id;
private UUID secondaryId;
public MyObject(UUID id, UUID secondaryId) {
this.id = id;
this.secondaryId = secondaryId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyObject myObject = (MyObject) o;
// Both id and secondary Id are not null on both objects
if (id != null && myObject.id != null && secondaryId != null &&
myObject.secondaryId != null) {
return id.equals(myObject.id) &&
secondaryId.equals(myObject.secondaryId);
}
// Id is not null on both objects
else if (id != null && myObject.id != null) {
return id.equals(myObject.id);
}
// Secondary id is not null on both objects
else if (secondaryId != null && myObject.secondaryId != null) {
return secondaryId.equals(myObject.secondaryId);
}
return false;
}
@Override
public int hashCode() {
// TODO: How do write a hashcode that reflects the equals method?
}
}
从我对方式的小想法来看,似乎很难做到,因为你总是会丢失数据。当您尝试将对象与使用定义了单个ID的对象定义的两个ID匹配时,我不知道您将如何知道真相。我能想出的最佳答案是,如果你总是有一个两个 id定义的对象,你可以创建一个散列,它是两个键的两个16位散列的组合他们之间有一个标记。因此,您始终会查看第一个ID的前16位,然后查看第二个ID的后16位。这就是说 - 我不知道如何用Java这样的语言编写这种方法。
TLDR; 您如何编写hashCode()方法?
答案 0 :(得分:3)
你不能。没有办法为2个不同的对象创建一个唯一的哈希码,这两个对象都是"等于"另一个对象。
引自Wikipedia:
此方法(hashCode())的重写实现的常规协定是 它们的行为方式与同一对象的行为相等() 方法:给定对象必须始终报告相同的哈希 值(除非它被更改,以便不再使用新版本 考虑"平等"到旧),和那两个等于()的对象 说相等必须报告相同的哈希值。