重写 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 加入
还未添加个人简介










评论