为什么重写equals必须重写hashcode?

时间:2021-08-05 16:02:33

示例代码:

 

class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return com.google.common.base.Objects.equal(getName(), user.getName());
    }


    public String getName() {

        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public static void main(String[] args) {
        List<User> us = new ArrayList<>();
        while (true) {
            User u1 = new User("daxin");
            User u2 = new User("daxin");
            if(u1.hashCode()!=u2.hashCode()){
                System.out.println(u1.equals(u2));
                System.out.println();
            }

        }

    }
}

  

你会发现,纵然equals相等但是hashCode却不相等,在Map中这样的话会存在存储重复,即相同key对应多个value,因此必须重写hashCode方法保证equals相等则hashCode一定相等。