我在HashSet比较中进行了此测试,但equals 并未被调用
equals
当farAway = false时我想考虑等于(检查两个点距离的函数)
完整的可编译代码,您可以对其进行测试,并说明为什么在此示例中未调用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添加到调用等于?
如果哈希码不同,则无需调用,equals()因为可以保证可以返回false。
equals()
false
在此之前,从一般的合同上equals()和hashCode():
hashCode()
如果根据该equals(Object)方法两个对象相等,则hashCode在两个对象中的每个对象上调用该方法必须产生相同的整数结果。
equals(Object)
hashCode
现在,您的班级正在违反这份合同。您需要解决此问题。