重写hashcode和equals方法的原因

295 阅读2分钟

1.不重写hashcode的后果

类中没有重写hashcode方法,所以调用的是Object类的hashcode方法,获取对象地址值

代码展示

public class User {

    /** 用户名 */
    private String username;
    /** 密码 */
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public User() {}

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

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public static void main(String[] args) {

        User user1 = new User("123");

        User user2 = new User("123");

        System.out.println(user1.hashCode());
        System.out.println(user2.hashCode());

    }
}

打印展示

未重写hashcode

2.重写hashcode,但是不重写equals的后果

能用hashcode找到对应索引位,但可能存在冲突,所以会调用equals判断是否相等,类中没有重写equals方法,所以调用的是Object类的equals方法,以地址值判断

代码展示

import java.util.Objects;

public class User {

    /** 用户名 */
    private String username;
    /** 密码 */
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public User() {}

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

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

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

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public static void main(String[] args) {

        User user1 = new User("123");

        User user2 = new User("123");

        System.out.println("user1的hashcode值为: " + user1.hashCode());
        System.out.println("user2的hashcode值为: " + user2.hashCode());
        System.out.println("user1与user2是否相同: " + user1.equals(user2));

    }
}

打印展示

重写hashcode,但是不重写equals的后果

3.重写hashcode和equals

代码展示

import java.util.Objects;

public class User {

    /** 用户名 */
    private String username;
    /** 密码 */
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public User() {}

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

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @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(username, user.username) && Objects.equals(password, user.password);
    }

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

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public static void main(String[] args) {

        User user1 = new User("123");

        User user2 = new User("123");

        System.out.println("user1的hashcode值为: " + user1.hashCode());
        System.out.println("user2的hashcode值为: " + user2.hashCode());
        System.out.println("user1与user2是否相同: " + user1.equals(user2));

    }
}

打印展示

重写hashcode和equals