已经重写了hashcode和equals还是添加了重复代码
来源:3-13 编程练习
可莉我女儿
2021-06-11 11:48:58
package com.rong.set;
//学生类
public class Student {
private int id;
private String name;
private double score;
//构造方法
public Student(int id, String name, double score) {
super();
this.id = id;
this.name = name;
this.score = score;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getScore() {
return score;
}
public void setScore(double score) {
this.score = score;
}
//重写toString
@Override
public String toString() {
String str="学号:"+this.getId()+",姓名:"+this.getName()+",成绩:"+this.getScore();
return str;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + id;
result = prime * result + ((name == null) ? 0 : name.hashCode());
long temp;
temp = Double.doubleToLongBits(score);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if(this==obj)
return true;
if(Student.class==obj.getClass()) {
Student sd=(Student) obj;
return (sd.getName().equals(name))&&(sd.getId()==id);
}
return false;
}
}
package com.rong.test;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import com.rong.set.Student;
public class StudentTest {
public static void main(String[] args) {
Student s1=new Student(1,"Tom",87);
Student s2=new Student(2,"Lucy",95);
Student s3=new Student(3,"William",65);
//创建集合
Set set=new HashSet();
set.add(s1);
set.add(s2);
set.add(s3);
//迭代器
Iterator it=set.iterator();
//输出集合元素
while(it.hasNext()) {
System.out.println(it.next());
}
//添加一个重复元素
Student s4=new Student(3,"William",66);
set.add(s4);
System.out.println("添加重复元素后:");
it=set.iterator();
//输出集合元素
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
相关截图:

2回答
同学你好,同学出现这样的问题是因为hashCode方法。在HashSet添加数据的底层比较中,会先比较hash值是否相等,如果hash值不相等,两个对象不相同,直接添加。如果hash值相等,再来通过equals方法比较对应属性。所以这里需要将hashCode中的score内容去掉:

祝学习愉快~
可莉我女儿
提问者
2021-06-11
这里重写的equals方法并没有比较成绩,这样就算我成绩不一样,也应该添加不了的啊
相似问题