Collections Java 1.8重写的equals()未被集合removeAll()调用

Collections Java 1.8重写的equals()未被集合removeAll()调用,collections,java-8,overriding,equals,removeall,Collections,Java 8,Overriding,Equals,Removeall,在我的IDE(EclipseNeon)上,我运行的是jre 1.8。正如您在下面的代码片段中所看到的,我开发了覆盖equals方法的自定义类。这是因为当我从一组自定义类执行removeAll方法时,我想使用我的重写版本 查看jdk源代码内部,可以验证removeAll方法是否使用contains方法,contains方法反过来使用对象类的equals方法 public class MyClass { private String connectionID; public My

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

查看jdk源代码内部,可以验证removeAll方法是否使用contains方法,contains方法反过来使用对象类的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());
    }

}
公共类MyClass{
私有字符串连接ID;
公共MyClass(){
...
}
@凌驾
公共布尔等于(对象obj){
if(MyClass的obj实例){
if(((MyClass)obj.getConnectionID().equalsIgnoreCase(this.getConnectionID())){
返回true;
}
}
返回false;
}
...
}
公共类MyClassContainer{
私有集合类=新HashSet();
公共集getClasses(){
将此文件返回。类;
}
}
公共类Main(){
私有void方法(MyClassContainer contClass){
如果(真){
设置温度=某个有效设置;
temp.removeAll(contClass.getClasses());
}
}
启动这段代码时,我意识到永远不会调用重写的equals方法

怎么了


感谢

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

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

您使用的是什么类型的集合实现?请注意,如果您重写equals,您也应该重写hashCode以保持一致。这可能是您的问题。请注意,可能存在重复!如果您的equals是使用
equalsIgnoreCase
实现的,则哈希代码也必须不区分大小写,而此实现不区分大小写尽管如此,在本例中,ID比较很可能实际上不区分大小写。因此,
equals
的实现可以更正并简化为
return(obj instanceof MyClass)&&((MyClass)obj.getConnectionID().equals(this.getConnectionID());