写点什么

重写 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
用户头像

javaNice

关注

还未添加个人签名 2023-11-02 加入

还未添加个人简介

评论

发布
暂无评论
重写equals后为什么要重写hashcode方法_Java_javaNice_InfoQ写作社区