gpt4 book ai didi

多个 equals 和 if 的 Java 哈希码实现

转载 作者:行者123 更新时间:2023-12-01 06:10:04 31 4
gpt4 key购买 nike

据我所知,每个 equals 对象必须具有相同的哈希码。但是,如果 equals 方法有多个,如果需要遵循怎么办?

Location 是一个对象,Junction 是一个对象,length 是一个整数,offset 是一个整数,section 是一个对象。

我已经解决了 atAJunction 方法中的问题,我仅使用 junction 作为附加哈希码。当Section相等时,其Section的长度等于两个位置的偏移量。我为此使用的哈希码仅使用部分作为哈希码。

主要问题是当它们具有不同的部分,但相同的偏移量和终点时。它相等,但哈希码不同。

有人可以帮我解决我的问题吗?谢谢之前。 :)

这是我的等于方法:

@Override
public boolean equals(Object object) {
if(object == null){
return false;
}
if(!(object instanceof Location)){
return false;
}else{
Location otherLocation = (Location) object;
if(atAJunction() && otherLocation.atAJunction()){
return this.endPoint.getJunction().equals(otherLocation.getEndPoint().getJunction());
}else{
// The Problem Here
if(this.endPoint.equals(otherLocation.endPoint)){
return this.offset == otherLocation.getOffset();
}else{
return this.section.equals(otherLocation.getSection()) &&
this.section.getLength() == (this.offset + otherLocation.getOffset());
}
}
}
}

这是我的哈希代码:

@Override
public int hashCode() {
// creates a polynomial hash-code based on the fields of the class.
final int prime = 13; // an odd base prime
int result = 1; // the hash code under construction
if(atAJunction()){
result = prime * result + this.endPoint.getJunction().hashCode();
}else{
result = prime * result + this.section.hashCode();
}
return result;
}

最佳答案

首先我不明白的是为什么你需要这个额外的检查

 return this.section.equals(otherLocation.getSection()) && 
**this.section.getLength() == (this.offset + otherLocation.getOffset());**

理想情况下,如果各部分相等,则长度和所有内容都应该已包含在其中。将一个对象的内部值与其他类的某些派生值进行比较很容易出错,应避免在 equals() 等方法中使用。

您可能想看看这本书,http://www.amazon.com/Effective-Java-Edition-Joshua-Bloch/dp/0321356683 。作者在这里以一种不错的方式解释了哈希码和等于的关系。这绝对对你有帮助。

就您的情况而言,我的建议是,如果您不太清楚生成 hashcode() 和 equals() 的正确方法,请尝试使用 IDE 中内置的代码生成器,例如 Eclipse 或 netbeans。

关于多个 equals 和 if 的 Java 哈希码实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36471346/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com