我在 HashSet 比较中进行了这个测试,equals
没有被调用。
当 farAway=false 时,我希望考虑 equals。(这是用于检查两个点之间距离的函数)
这是一份完整可编译的代码,你可以测试它,并告诉我为什么在这个例子中 equals 没有被调用。
public class TestClass{
static class Posicion
{
private int x;
private int y;
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Posicion other = (Posicion) obj;
if ( farAway(this.x, other.x, this.y, other.y,5)){
return false;
}
return true;
}
@Override
public int hashCode() {
int hash = 7; hash = 59 * hash + this.x; hash = 59 * hash + this.y;
return hash;
}
Posicion(int x0, int y0) {
x=x0;
y=y0;
}
private boolean farAway(int x, int x0, int y, int y0, int i) {
return false;
}
}
public static void main(String[] args) {
HashSet<Posicion> test=new HashSet<>();
System.out.println("result:"+test.add(new Posicion(1,1)));
System.out.println("result:"+test.add(new Posicion(1,2)));
}
}
编辑
-有没有一种方法可以强制 HashSet add 方法调用 equals 方法?
equals
内的farAway
调用是什么意思?你的类破坏了hashCode
和equals
之间的约定! - Alonso DominguezhashCode
和equals
之间的契约。这意味着当你的equals
方法返回true时,你的hashCode
方法必须返回相同的整数值。但是在你的代码中并没有发生这种情况。 - Alonso DominguezhashCode()
的契约,还要遵守equals()
的契约。equals()
必须是传递性的。因此,如果您因为A和B之间很接近而返回true
,因为它们很接近,B和C之间也很接近,那么当检查A和C之间的相等性时,如果它们恰好不接近,则会遇到问题。我认为你需要设计一个容器/数据结构,而不是标准的HashSet来实现你想要做的事情(如果你想要做的事情在第一时间就是一个好主意的话)。 - Michael Burr