设置在 JAVA 中工作不正确

Set working incorrectly in JAVA

我只想从列表中删除重复的元素。为此,我编写了一个 POJO class Student 作为 :

class Student{

private String roll;
private String name;

public Student(String roll, String name) {
    this.roll = roll;
    this.name = name;
}
@Override
public boolean equals(Object obj) {
    Student st = (Student) obj;
    return st.getRoll().equals(roll);
}

public String getRoll() {
    return roll;
}
public void setRoll(String roll) {
    this.roll = roll;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
@Override
public String toString() {
    return roll ;
}

}

还有一个测试 class 如下:

public class TestMain {
public static void main(String[] args) {

    List<Student> list = Arrays.asList(
            new Student("19", "goutam kumar singh"),
            new Student("20", "goutam kumar singh"),
            new Student("11", "goutam kumar singh"),
            new Student("19", "goutam kumar singh")
            );

    List<Student> arrayList = new CopyOnWriteArrayList<>(list);
    Set<Student> set = new HashSet<>();

    for(Student st : arrayList)
        set.add(st);
    System.out.println(set);
}
}

但在输出中集合中的所有四个元素,但我期望只有三个元素,因为第四个元素是重复的,必须删除。

我哪里错了?

您还必须覆盖 hashCode() 方法。为您覆盖 equals() 方法的那些 属性 覆盖 hashCode() 方法。

在使用 Collection 时,记住 hashCode()equals() 方法之间的约定很有用 -

1. If two objects are equal, then they must have the same hash code.
2. If two objects have the same hashcode, they may or may not be equal.

有关更多信息,您可以访问此 link

HashSet 在内部将元素存储为 HashMap 中的键。因此,它将使用您的 Student 对象作为该映射的键,并使用每个对象的哈希码。由于您没有为此方法 hashCode() 提供实现,因此将使用 Object 中的默认实现,并且您的每个学生都会有不同的哈希码。

您必须在 class 中扩展此方法,注意 equals-hashCode 协定。如果两个对象相等,则它们必须具有相同的 hashCode(反之并不总是正确的)。有关详细信息,请参阅此 Object.hashCode()