重写equals后为什么要重写hashcode方法
1.set存储string字符串
2.只重写equals 不重写hashcode
set中存在两个一样的并没有去重
3.重写equals 也重写hashcode
set中只有一个对象
结论
Set 去重时,会先判断hashcode是否相同 再去判断equals方法是否相同
importjava.util.HashSet;
importjava.util.Objects;
importjava.util.Set;
publicclassTestEqualsAndHashCode {
publicstaticvoidmain(String[] args) {
//set保存string
// Set<String> set = new HashSet();
// set.add("zhangsan");
// set.add("zhangsan");
// set.add("lisi");
// set.add("wangwu");
// System.out.println("Set集合长度:" + set.size());
// System.out.println();
// set.forEach(d -> System.out.println(d));
//set存储对象
// 对象 1
Userp1=newUser();
p1.setName("zhangsan");
p1.setAge(18);
// 对象 2
Userp2=newUser();
p2.setName("zhangsan");
p2.setAge(18);
// 创建 Set 对象
Set<User>set=newHashSet<User>();
set.add(p1);
set.add(p2);
// 打印 Set 中的所有数据
set.forEach(p-> {
System.out.println(p);
});
}
staticclassUser{
privateStringname;
privateintage;
@Override
publicbooleanequals(Objecto) {
if (this==o) returntrue; // 引用相等返回 true
// 如果等于 null,或者对象类型不同返回 false
if (o==null||getClass() !=o.getClass()) returnfalse;
// 强转为自定义 User 类型
Useruser= (User) o;
// 如果 age 和 name 都相等,就返回 true
returnage==user.age&&
Objects.equals(name, user.name);
}
@Override
publicinthashCode() {
// 对比 name 和 age 是否相等
returnObjects.hash(name, age);
}
publicStringgetName() {
returnname;
}
publicvoidsetName(Stringname) {
this.name=name;
}
publicintgetAge() {
returnage;
}
publicvoidsetAge(intage) {
this.age=age;
}
@Override
publicStringtoString() {
return"User{"+
"name='"+name+'\''+
", age="+age+
'}';
}
}
}