一尘不染

HashSet的“ add”方法何时调用等于?]

java

我在HashSet比较中进行了此测试,但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添加到调用等于?


阅读 187

收藏
2020-09-08

共1个答案

一尘不染

如果哈希码不同,则无需调用,equals()因为可以保证可以返回false

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

如果根据该equals(Object)方法两个对象相等,则hashCode在两个对象中的每个对象上调用该方法必须产生相同的整数结果。

现在,您的班级正在违反这份合同。您需要解决此问题。

2020-09-08