转载

为什么重写equals()方法为什么要重写hashCode()方法

定义一下命题:

相等: 如果A和B相等,则A.equals(B)为true:如果A.equals(B)为true,则A和B相等;

相同:如果A和B相同,则A.hashCode() == B.hashCode(); 如果A.hashCode() == B.hashCode(); 则A和B相同

此问题的解释就会是:

如果只重写equals()方法,就会出现相等的两个对象不相同, 如果只重写hashCode()方法,就会出现相同的两个对象不相等。

案例1, 只重写equals()方法

public class Person {

    private final String name;

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

    /**
     * 只重写{@link #equals(Object)} 方法, 变成只要名称是相同对象,则两{@code Person}相等
     *
     * @param other 另一个对象
     * @return {@code true} : 两个两{@code Person}相等
     */
    @Override
    public boolean equals(Object other) {
        if (this == other) return true;

        if (other == null || getClass() != other.getClass()) return false;

        Person person = (Person) other;
        return Objects.equals(name, person.name);
    }
}
public static void main(String[] args) {
    String name = "张三";

    Person a = new Person(name);
    Person b = new Person(name);

    System.out.print("Person a 的HashCode : '" + a.hashCode() + "'");
    System.out.println("/tPerson b 的HashCode : '" + b.hashCode() + "'");

    //只要HashCode一样,则证明两对象相同
    System.out.print("Person a  和  Person b " + (a.hashCode() == b.hashCode() ? "" : "不") + "相同!");
    System.out.println("/t 但 Person a  和  Person b " + (a.equals(b) ? "" : "不") + "相等!");
}

为什么重写equals()方法为什么要重写hashCode()方法

案例2, 只重写hashCode()方法

public class Person {

    private final String name;

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

    /**
     * 只重写{@link #hashCode()}方法,相同hashCode的对象不向等
     * @return hash code 值
     */
    @Override
    public int hashCode() {
        return Objects.hash(name);
    }
}
public static void main(String[] args) {
    String name = "张三";

    Person a = new Person(name);
    Person b = new Person(name);

    System.out.print("Person a 的HashCode : '" + a.hashCode() + "'");
    System.out.println("/tPerson b 的HashCode : '" + b.hashCode() + "'");

    //只要HashCode一样,则证明两对象相同
    System.out.print("Person a  和  Person b " + (a.hashCode() == b.hashCode() ? "" : "不") + "相同!");
    System.out.println("/t 但 Person a  和  Person b " + (a.equals(b) ? "" : "不") + "相等!");
}

为什么重写equals()方法为什么要重写hashCode()方法

java 中对 hash code 有个通用的规定,即 相等的对象必须拥有相等的hash code ,就是说如果两个对象调用 equals() 方法相等,则它们调用 hashCode() 所得到的 hash code 值也相等,因此重写 equals() 方法要重写 hashCode() 方法!

那么重写 hashCode() 方法,是不是也需要重写 equals() ?,如果是那么可不可以说明 相等hash code的对象也相等? ,据我所知,好像并没有这个要求。

原文  https://segmentfault.com/a/1190000022373680
正文到此结束
Loading...