重写 equals 后为什么要重写 hashcode 方法
作者:javaNice
- 2023-11-27 四川
本文字数:1184 字
阅读完需:约 4 分钟
重写 equals 后为什么要重写 hashcode 方法
1.set 存储 string 字符串
2.只重写 equals 不重写 hashcode
set 中存在两个一样的并没有去重
3.重写 equals 也重写 hashcode
set 中只有一个对象
结论
Set 去重时,会先判断 hashcode 是否相同 再去判断 equals 方法是否相同
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class TestEqualsAndHashCode {
public static void main(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
User p1 = new User();
p1.setName("zhangsan");
p1.setAge(18);
// 对象 2
User p2 = new User();
p2.setName("zhangsan");
p2.setAge(18);
// 创建 Set 对象
Set<User> set = new HashSet<User>();
set.add(p1);
set.add(p2);
// 打印 Set 中的所有数据
set.forEach(p -> {
System.out.println(p);
});
}
static class User{
private String name;
private int age;
@Override
public boolean equals(Object o) {
if (this == o) return true; // 引用相等返回 true
// 如果等于 null,或者对象类型不同返回 false
if (o == null || getClass() != o.getClass()) return false;
// 强转为自定义 User 类型
User user = (User) o;
// 如果 age 和 name 都相等,就返回 true
return age == user.age &&
Objects.equals(name, user.name);
}
@Override
public int hashCode() {
// 对比 name 和 age 是否相等
return Objects.hash(name, age);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
}
复制代码
划线
评论
复制
发布于: 刚刚阅读数: 4
版权声明: 本文为 InfoQ 作者【javaNice】的原创文章。
原文链接:【http://xie.infoq.cn/article/a0031fc5662eecfb0ff2691b5】。文章转载请联系作者。
javaNice
关注
还未添加个人签名 2023-11-02 加入
还未添加个人简介
评论