需要重写的 场景:
HashSet对 对象地址相同 的对象 去重。
但 现在我们规定:
当学生的学号、姓名都相等时,认为 学生对象 相等 【不一定需要对象地址相同】
1.创建Student类:
public class Student {
private String name;
private Integer code;
public Student(String name, Integer code) {
this.name = name;
this.code = code;
}
public Student() { }
//在测试类 可打印出以下内容
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", code=" + code +
'}';
}
/*因为所有的java类都讲继承Object类,而且是当该类没有继承父类的时候,默认继承Object类为父类;
并且Object类中是存在hashCode的方法和equals方法的,子类和父类Object中的方法一致,所以叫重写 */
/*
自定义去重规则=重写hashset中的2个方法
去重学号相同的 学生
*/
// 重写hashcode方法------仅hashcode返回的int相同时,才会调用equals方法
@Override
public int hashCode() {
//此处要求: 学号不重复、姓名不重复
//返回 当前对象的学号
return code;
//如果是对 名字=字符串 去重
//return name.hashCode();//每个字符串都有hashCode
//名字 和 学号 加起来的返回值int
//return name.hashCode()+code;
//网上的算法 ,不理解
//final int prime = 31;
//int result = 1;
//result = prime * result + id;
//result = prime * result + ((name == null) ? 0 : name.hashCode());
//return result;
//返回恒定值,使每个对象有同样的hashcode,则一定执行equals方法
//return 10;
}
/*
重写equals方法=2个对象(参数obj和this)的比较 : 返回值 true相同--去掉 false不同--留下
2个判断
1.参数obj 是否为 Student的实例
2.自定义去重判断语句
*/
/*
当以上hashcode直接恒return 10; =恒一定会调用equals方法时:
equals会被调用执行=比较几次?
*/
@Override
public boolean equals(Object obj) {
//是否为 同1个类or其子类创建的 对象
if(!(obj instanceof Student)) {//不是同1个类Student 没可比性
// instanceof 已经处理了obj = null的情况
return false;
}
//运行到此处 一定是Student类创建的对象
//转为Student对象
Student stuObj = (Student) obj;
// 如果两个对象学号、姓名相等,我们认为两个对象相等
//由于hashcode方法已比较学号,此处可省略学号判断
//stuObj.code==this.code &&
if (stuObj.name.equals(this.name) ) {
return true;
} else {
return false;
}
}
}
2.测试类 走起:
public class test {
public static void main(String[] args) {
Student s1 = new Student("小花", 2);
Student s2 = new Student("小花", 2);
Student s3 = new Student("大黄", 7);
HashSet<Student> students = new HashSet<>();
students.add(s1);
students.add(s2);
students.add(s3);
students.add(null);
for (Student student : students) {
System.out.println(student);
}
}
}
运行结果:
当hashcode返回10为定值,equals方法恒执行,
后面进去的人,
要跟前面已经进去的人 ,
依次握手。(相当于说 除了第一个进去的人不用)
依次递增,相加为和 = equals共执行次数