这是我的学生班,我想根据“名称”字段区分学生对象。但是当执行主类时,我得到了错误的输出。
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”对象?
答案 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生成类似选项