哈希码和等于

Nit*_*eti 8 java hashcode

equalshashCode方法必须一致,这意味着当两个对象根据equals方法相等时,它们的hashCode方法应该返回相同的哈希值.

如果我们不覆盖hashCode()方法,Java将返回唯一的哈希代码.

class HashValue {

    int x;

    public boolean equals(Object oo) {
        // if(oo instanceof Hashvalue) uncommenting ths gives error.dunno why?
        // :|
        HashValue hh = (HashValue) oo;

        if (this.x == hh.x)
            return true;
        else
            return false;
    }

    HashValue() {
        x = 11;
    }

}

class Hashing {
    public static void main(String args[]) {
        HashValue hv = new HashValue();
        HashValue hv2 = new HashValue();

        System.out.println(hv.hashCode());
        System.out.println(hv2.hashCode());

        if (hv.equals(hv2))
            System.out.println("EQUAL");
        else
            System.out.println("NOT EQUAL");
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么取消注释该行会产生编译错误?

如果对象具有不相等的哈希码,为什么即使默认哈希码变化,它们也显示相等?

Tod*_*lin 6

首先,在该行中,您需要更改HashvalueHashValue,因为您的类实际上已被调用HashValue.

然后,取消注释该行为您提供:

public boolean equals(Object oo) {
    if(oo instanceof HashValue)
        HashValue hh = (HashValue)oo;

    if (this.x==hh.x) {
        return true;
    } else {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

这有一些问题:

  1. 这不会编译,因为hh当你最终使用它时,它不在范围内.

  2. 第一个if语句应该确保在比较两个不是HashValues的东西(即抛出异常)时根本不运行该函数,或者它应该返回,false因为HashValues永远不会等于其他类型的对象.我通常更喜欢回到false抛出异常.

  3. 第二个if语句是多余的,因为您只是返回条件评估的内容.

像这样重写你的方法:

public boolean equals(Object oo) {
    if(!(oo instanceof Hashvalue)) {
        return false;
    }

    HashValue hh = (HashValue)oo;
    return (this.x == hh.x);
}
Run Code Online (Sandbox Code Playgroud)

这也不太对劲.为了确保所有相等的对象具有相同的哈希代码,您必须重写hashCode()HashValue,而且必须确保它不辜负保证.在这里,你可以添加这个:

// inside HashValue
int hashCode() {
    return x;
}
Run Code Online (Sandbox Code Playgroud)

实现是微不足道的,因为你的对象只是一个包装器int.随着对象越来越复杂,你需要更加思考.


bry*_*sai 6

平等仅由方法equals()决定.方法hashCode()用于其他情况,例如Map或Set.在实际调用equals(效率)之前,它有点像先决条件或提示.因此假设如果2个对象相等(即equals()返回true),则它们的hashCodes()必须返回相同的值.

所以在你的代码中,只要你的overriden equals()返回true,两个对象是相等的,无论hashCode()是什么.在比较相等性时,根本不调用hashCode().

这个问题有关于equals()和hashCode()之间关系的更深入的信息.