一文搞懂--Java中重写equals方法为什么要重写hashcode方法?

Java中重写equals方法为什么要重写hashcode方法?

直接看下面的例子:

首先我们只重写equals()方法

public class Test {

    public static void main(String[] args) {
        User user1 = new User();
        User user2 = new User();
        System.out.println(user1.equals(user2)); 
        System.out.println(user1.hashCode()); 
        System.out.println(user2.hashCode()); 
        HashMap<User,String> map = new HashMap<User,String>();
        map.put(user1,"123");
        map.put(user2,"456");
        System.out.println(map.get(user1));
        System.out.println(map.get(user2));
    }

}

class User{
    private String name;
    private String password;
    private String address;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name) &&
                Objects.equals(password, user.password) &&
                Objects.equals(address, user.address);
    }
    
}

输出结果:

true
1163157884     
1956725890
123
456

有没有发现问题出在哪里?

用equals比较说明对象相同,但是在HashMap中却以不同的对象存储(没有重写hascode值,两个hascode值,在他看来就是两个对象)。

到底这两个对象相等不相等?
说明必须重写hashCode()的重要性,

接下来重写重写equals方法和hashCode方法,再比较

public class Test {

    public static void main(String[] args) {
        User user1 = new User();
        User user2 = new User();
        System.out.println(user1.equals(user2));
        System.out.println(user1.hashCode());
        System.out.println(user2.hashCode());
        HashMap<User,String> map = new HashMap<User,String>();
        map.put(user1,"123");
        map.put(user2,"456");
        System.out.println(map.get(user1));
        System.out.println(map.get(user2));
    }

}

class User{
    private String name;
    private String password;
    private String address;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name) &&
                Objects.equals(password, user.password) &&
                Objects.equals(address, user.address);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, password, address);
    }
}

输出结果:

true
29791  //相同的对象
29791
456   //说明以一个值key存储,相同的值
456

看到这里,你懂了吗? 还不懂,可以自己实现一遍代码。

posted @ 2019-11-26 11:32  超人不会飞er  阅读(279)  评论(0编辑  收藏  举报