正在回答
//我们知道,判断一个set集合中的元素是否重复,通常分为两步:第一步是调用hashCode()方法,该方法会返回一个Int型的值,如果这个返回值相等,会进行第二步判断,即为调用equals()方法;如果返回值不相等,就不用再继续调用equals()方法判断了,换而言之,系统就已经断定所加元素一定无重复,可以看到你覆写的hashCode方法
@Ovriride public int hasCode(){ final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); result = prime * result + Float.floatToIntBits(score); result = prime * result + stuID; return result; } //该方法引用到了3个字段(name,score,stuID),而你所添加的元素的score值并不一样,所以 hashCode()返回的值就不一样了,所以系统此时就已经断定了你所添加的元素一定是不重复的, 再调用equals()方法就没意义了,这就是出现该现象的原因了。
package arraylists;
public class Student {
//属性为:学号stuId(int),姓名name(String),成绩score(float)
private int stuID;
private String name;
private float score;
//构造方法
public Student(int stuID, String name, float score) {
super();
this.stuID = stuID;
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student [学号:" + stuID + ", 姓名:" + name + ", 成绩:" + score + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
result = prime * result + Float.floatToIntBits(score);
result = prime * result + stuID;
return result;
}
@Override
public boolean equals(Object obj) {
if(obj==this) {
return true;
}
if(obj.getClass()==Student.class) {
Student student=(Student)obj;
return (student.getName().equals(name))&&(student.getStuID()==stuID);
}
return false;
}
//getter和setter方法
public int getStuID() {
return stuID;
}
public String getName() {
return name;
}
public float getScore() {
return score;
}
public void setStuID(int stuID) {
this.stuID = stuID;
}
public void setName(String name) {
this.name = name;
}
public void setScore(float score) {
this.score = score;
}
}
//测试类
package arraylists;
import java.util.HashSet;
import java.util.Iterator;
public class StudentTest {
public static void main(String[] args) {
//定义三个Student类的对象及一个HashSet类的对象
HashSet<Student> set=new HashSet<Student>();
Student one =new Student(1, "William", 65);
Student two =new Student(2, "Tom", 87);
Student three =new Student(3, "Lucy", 95);
//将Student类的对象添加到集合中
set.add(one);
set.add(two);
set.add(three);
//使用迭代器显示Student类的对象中的内容
Iterator<Student> it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
System.out.println("**************************");
//添加一个重复数据到Set中,观察输出结果
Student four =new Student(3, "Lucy", 10);
set.add(four);
it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
- 参与学习 人
- 提交作业 3802 份
- 解答问题 11489 个
本阶段带你迈入Java世界,学习Java必备基础知识,基础语法、面向对象思想以及常用工具类的使用。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星