如何实现评估列表中包含的 class

howto implement a class that evealuates contains in a list

我有: - MyClass 被 hashCode() 覆盖 - 我将尽量避免使用 List.

的 contains() 方法将具有相同内容的第二个 MyClass 实例添加到 List。

我怎样才能做到这一点?我认为这是通过重写 hashCode() 方法完成的?

我猜代码说的比字多

public class TestClass {

    public static void main(String[] args){

        MyClass myclass1 = new MyClass(2);
        MyClass myclass2 = new MyClass(2);

        List<MyClass> myclasses = new ArrayList<MyClass>();
        myclasses.add(myclass1);
        if(!myclasses.contains(myclass2)){
            myclasses.add(myclass2);
            System.out.println("I'll add ...");
        }

        System.out.println(myclasses.size());
    }
}

public class MyClass {

    int id = -1;
    String something = "";

    public MyClass(int idparam){
        this.id = idparam;
    }

    @Override
    public int hashCode() {
        return id;
    }

}

已更新Class:

public boolean equals(MyClass secondmyclass) {
    return secondmyclass.id == this.id;
}

您必须覆盖 equals 和 hashcode 方法。该对象不包含在列表中,因为它不等于列表中的任何实例,即使它生成相同的哈希码也是如此。

@Override
public boolean equals(Object obj) {
    boolean eq = false;
    if (obj != null && obj instanceof YOURCLASS) {
        eq = this.getId().equals((YOUCLASS)obj.getId());
    }
}

Equals 方法应该如下所示。 YOURCLASS 是添加到列表中的 bean 的名称。您必须在验证 obj 实例不为 null 并且与原始实例属于同一类型后比较关键字段。

在您的示例中,YOURCLASS 是 MyClass,equals 中的比较应该使用 == 而不是 equals,因为您没有在该字段中使用 int insteand of Integer。