package com.example.demo;
import java.util.HashSet;
import java.util.Set;
public class Test {
public static void main(String[] args) {
Set<Student> o = new HashSet<>();
Student o1 = new Student(1,"zhangsan");
Student o2 = new Student(1,"zhangsan");
o.add(o1);
o.add(o2);
/**
* 根据业务要求:如果两个学生的编号、姓名相同,则认为是同一个学生。
* 原理:Object.hashCode()生成哈希值,由于不可避免地会存在哈希值冲突的情况,因此当哈希值相同时,还需要再调用equals进行一次值的比较,
* 但是,若哈希值不同,将直接判定Objects不同,跳过了equals,这加快了冲突处理效率。
*
* (1)两个对象的equals结果相等,则两个对象的哈希值必须相同。 (两个对象的哈希值不同,则一定是不同的对象。如果哈希值相同,则再根据equals判断是不是不同的对象)
*
* 这个例子中的hashSet集合,判断集合中的对象是不是同一个对象时,就是先根据哈希值判断,再根据equals判断
* 如果没有重写哈希方法,那么集合中就存入了两个对象。
*/
System.out.println(o);
}
}
class Student {
private int id;
private String name;
public Student(int id,String name) {
this.id = id;
this.name = name;
}
@Override
public boolean equals(Object obj) {
// 如果为null,或者并非同类,则直接返回false
if(obj == null || this.getClass() != obj.getClass()) {
return false;
}
if(this == obj) { // 内存地址相同,返回true
return true;
}
Student obj2 = (Student)obj; // 强转为学生类
if(this.getId() == obj2.getId() && this.getName().equals(obj2.getName())) { // 如果编号、姓名相同,则认为是同一个学生类
return true;
}
return false;
}
@Override
public int hashCode() {
return id+name.hashCode(); // 如果(编号+姓名的hash值)不同,则肯定不是同一个学生。
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
网友评论