判重顺序:HashSet在执行add时会首先根据目标类的hashcode判断是否有与其hashcode相同的对象,若有则使用equals该对象判断是否与其相同
默认的 equals 比较的是地址值
在重写 equals 方法的同时,必须重写hashCode方法。
示例:我们想 只根据 id 判定是不是同一个学生,即 set 中不能出现 id 相同的学生。
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<Stu> set = new HashSet<>();
for (int i = 1; i <= 5; i++) {
set.add(new Stu(i));
}
for (int i = 1; i <= 3; i++) {
set.add(new Stu(i));
}
System.out.println(set.toString());
}
}
class Stu {
int id;
String name;
public Stu(int id) {
this.id = id;
}
public String toString() {
return "编号:" + this.id;
}
/*
@Override 必须带上重写符号
public int hashCode() {
return this.id;
}
@Override
public boolean equals(Object s) {//必须是Object类
Stu ss = (Stu)s;//转为Stu类
return this.id == ss.id;
}
*/
}
运行结果:
去掉注释后: