在JAVA中设置不正确

时间:2015-11-09 12:44:44

标签: java collections set hashcode hashset

我只是想从列表中删除重复的元素。为此,我写了一个POJO类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 ;
}

}

如下所示的测试课程:

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);
}
}

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

我哪里错了?

2 个答案:

答案 0 :(得分:7)

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

在使用Collection时,记住hashCode()equals()方法之间的合同非常有用 -

  

1。如果两个对象相等,则它们必须具有相同的哈希码    2. 如果两个对象具有相同的哈希码,则它们可能相等也可能不相同。

有关详细信息,请访问此link

答案 1 :(得分:2)

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

您必须在类中扩展此方法,并了解equals-hashCode合约。如果两个对象相等,则它们必须具有相同的hashCode(反之并非总是如此)。有关详细信息,请参阅此Object.hashCode()