老师,请问下为什么我重写了equals方法后,还是会出现重复数据。因为之前的课程视频说hashCode方法是默认的不需要重写,所以我没重写,是不是跟这点有关呢
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class StudentTest {
public static void main(String[] args) {
//定义三个Student类的对象及一个HashSet类的对象
Student s1 = new Student(1,"Tom",87.0f);
Student s2 = new Student(2,"Lucy",95.0f);
Student s3 = new Student(3,"William",65.0f);
Set set = new HashSet();
//将Student类的对象添加到集合中
set.add(s1);
set.add(s2);
set.add(s3);
//使用迭代器显示Student类的对象中的内容
Iterator it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//添加重复数据到Set中
System.out.println("**********************");
System.out.println("添加重复数据后的输出结果");
Student s4 = new Student(2,"Lucy",95.0f);
set.add(s4);
it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
public class Student{
//根据需求完成Student类的定义
private int stuld;//学号
private String name;//姓名
private float score;//成绩
//默认构造方法
public Student(){
}
//带参构造方法
public Student(int stuld,String name,float score){
this.setStuld(stuld);
this.setName(name);
this.setScore(score);
}
//getter和setter方法
public int getStuld(){
return stuld;
}
public void setStuld(int stuld){
this.stuld = stuld;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public float getScore(){
return score;
}
public void setScore(float score){
this.score = score;
}
//重写toString方法
public String toString(){
return "[学号:"+stuld+",姓名:"+name+",成绩:"+score+"]";
}
//重写hashCode方法
//重写equals方法
public boolean equals (Object obj){
if(obj == this)
return true;
if(obj.getClass()==Student.class){
Student stu = (Student)obj;
return stu.getStuld() == stuld && stu.getName().equals(name) && stu.getScore() == score;
}
return false;
}
}
相关截图:
正在回答
同学您好,
之所以重复是因为hashCode()是根据对象地址生成的,每个new出来的对象的地址值是不同的。如果不重写hashCode方法,默认返回的是根据该对象地址生成的哈希码值。每个对象的hashCode()值都不一样,所以每个对象都不会相等,从而导致重复添加。所以建议重写hashCode()方法
祝同学学习愉快~
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星