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

2023-11-27 09:42:27 浏览数 (1)

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

1.set存储string字符串

image-20230815105439761image-20230815105439761

2.只重写equals 不重写hashcode

image-20230815105946358image-20230815105946358

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

image-20230815110011768image-20230815110011768

3.重写equals 也重写hashcode

image-20230815110254402image-20230815110254402

set中只有一个对象

image-20230815110320503image-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  
                    '}';
        }

    }
}

0 人点赞