什么时候HashSet的“添加”方法调用等号? [重复](When does HashSet &

2019-07-18 15:37发布

这个问题已经在这里有一个答案:

  • 哪些问题应该在Java中覆盖equals和hashCode时,应考虑? 11个回答

我做了这个测试在一个HashSet对比和equals 不会被调用

我想考虑等于当遥远= FALSE(A功能检查两个点的距离)

全编译代码,你可以测试它,并告诉为什么等于不会被调用在这个例子中。

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)));
    }
}

编辑

-is有没有办法迫使HashSet的添加叫平等?

Answer 1:

如果哈希代码不同,没有必要调用equals()因为它是保证返回false

在此之前,从一般合同上equals()hashCode()

如果两个对象根据相等equals(Object)方法,然后调用hashCode在各两个对象的方法必须产生相同的整数结果。

现在你的类打破了合同。 你需要解决这个问题。



Answer 2:

如果你想equals()将总是叫,只是总回报,比如说, 0hashCode() 这样,所有项目都使用相同的散列码,并与单纯比较equals()

public int hashCode() {
  return 0;
}


Answer 3:

这听起来像HashSet的是不适合你。 这听起来像你想比较两个位置的定制方式。 与其说“有两个位置完全相等?”。 相反,你应该看看使用TreeSet中,具有比较。 通过这种方式,你可以写一个“IsWithinRangeComparator”做你的范围检查那里。



Answer 4:

如上所建议的,当对象是相等的,它们的哈希码也应该是相同的。 你可以做一个简单的解决您的哈希码的计算如下图所示。

 public int hashCode() {

int hash = 7; hash = 59 * hash + this.x; hash = 59 * hash + this.y;
boolean faraway=farAway(this.x, other.x, this.y, other.y,5);
hash=59*hash+(faraway?1:0); //include faraway also as part of hashcode computation

 return hash;

}



文章来源: When does HashSet 'add' method calls equals? [duplicate]