如何正确覆盖学生类的equals方法,以便HashSet可以区分学生类的duplicare对象

时间:2019-01-16 08:02:42

标签: java

这是我的学生班,我想根据“名称”字段区分学生对象。但是当执行主类时,我得到了错误的输出。

public class Student {

int id;
String name;

public Student(String name, int id)
{
    this.name=name;
    this.id= id;
}


public int hashCode()
{
    return this.id;
}

public String toString()
{
    return "Student: "+this.name+"@"+Integer.toHexString(hashCode());
}



public boolean equals(Object o)
{
    if(o instanceof Student)
    {
    String name=this.name;
    Student s=(Student)o;

    if(s.name.equals(name))
    return true;
    else 
    return false;
    }
    else
    return false;

}}

//这是我的主班

public class HashSett {

public static void main (String[] args)
{

    HashSet<Student> h=new HashSet<>();

    h.add(new Student("Nimit",1));
    h.add(new Student("Rahul",3));
    h.add(new Student("Nimit",2));

    System.out.println(h); 
 }
}

//这是我得到的错误输出

[Student: Nimit@1, Student: Nimit@2, Student: Rahul@3]

为什么要添加两次“ Nimit”对象?

2 个答案:

答案 0 :(得分:3)

您的hashCode与您的equals实现不匹配。如果a.equals(b)为true,则a.hashCode == b.hashCode()也必须为true。

由于equals仅要求名称相等,因此hashCode应该返回name.hashCode()

public int hashCode()
{
    return name.hashCode();
}

答案 1 :(得分:0)

从Eclipse的toe中生成toString,hashCode和equals或从任何IDE生成类似选项