Java 1.8重写的equals()没有被Collection removeAll()调用

时间:2017-04-12 20:39:13

标签: collections java-8 override equals removeall

在我的IDE(eclipse neon)上运行jre 1.8。正如您在下面的代码片段中看到的那样,我开发了My Custom类来覆盖equals方法。这是因为当我从一组自定义类中执行removeAll方法时,我想使用我的重写版本。

查看jdk源代码,可以验证removeAll方法是否使用contains方法,而contains方法又使用Object类的equals方法。

public class MyClass {
    private String connectionID;


    public MyClass (){      
    ...
    }


    @Override
    public boolean equals(Object obj) {      
        if (obj instanceof MyClass ){
            if (((MyClass )obj).getConnectionID().equalsIgnoreCase(this.getConnectionID())){
                return true;
            }
        }
        return false;
    }
...
}



public class MyClassContainer{

    private Set<MyClass> classes = new HashSet<>();

    public Set<MyClass> getClasses () {
        return this.classes ;
    }

}

public class Main (){

    private void method(MyClassContainer contClass) {

    if (true){
        Set<MyClass> temp = some valid Set;         
        temp.removeAll(contClass.getClasses());
    }

}

启动此代码我意识到永远不会调用重写的equals方法。

有什么不对?

由于

1 个答案:

答案 0 :(得分:0)

要使其正常工作,您还需要覆盖hashCode

@Override
public int hashCode() {
    return Objects.hash(getConnectionID());
}