前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >重写equals后为什么要重写hashcode方法

重写equals后为什么要重写hashcode方法

原创
作者头像
javaNice
发布2023-11-27 09:42:27
1470
发布2023-11-27 09:42:27
举报
文章被收录于专栏:javanicejavanice

重写equals后为什么要重写hashcode方法

1.set存储string字符串

image-20230815105439761
image-20230815105439761

2.只重写equals 不重写hashcode

image-20230815105946358
image-20230815105946358

set中存在两个一样的并没有去重

image-20230815110011768
image-20230815110011768

3.重写equals 也重写hashcode

image-20230815110254402
image-20230815110254402

set中只有一个对象

image-20230815110320503
image-20230815110320503

结论

Set 去重时,会先判断hashcode是否相同 再去判断equals方法是否相同

代码语言:java
复制
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 +
                    '}';
        }

    }
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.set存储string字符串
  • 2.只重写equals 不重写hashcode
  • 3.重写equals 也重写hashcode
  • 结论
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com