关于java:HashSet’add’方法调用何时等于?

When does HashSet 'add' method calls equals?

本问题已经有最佳答案,请猛点这里访问。

我在hashset比较中做了这个测试,没有调用equals

当遥远=错误时,我想考虑平等。(用于检查两点距离的功能)

完整的可编译代码,您可以测试它,并说明为什么在本例中不调用equals。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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)));
    }
}

编辑

-是否有方法强制将哈希集添加到调用equals?


如果散列码不同,则无需调用equals(),因为它保证返回false

这是根据关于equals()hashCode()的总合同:

If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.

现在你们班违反了合同。你需要解决这个问题。


如果你想一直叫equals(),就一定要回来,比如说,hashCode()里的0。这样,所有项目都具有相同的哈希代码,并且只与equals()进行比较。

1
2
3
public int hashCode() {
  return 0;
}


听起来哈希集不适合你。听起来你想要一种比较两个位置的自定义方式。而不是说"两个位置完全相同吗?".相反,您应该使用带有比较器的treeset。这样,您就可以编写一个"iswithinRangeComparator",并在那里检查范围。


如上所述,当对象相等时,它们的哈希代码也应该相同。您可以像下面这样对散列代码计算进行简单的修正。

1
2
3
4
5
6
7
 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;

}