猿问

为什么key的hashcode有大于等于小于等于三种情况?

中有一些代码java.util.HashMap.TreeNode#putTreeVal(),如下所示:


if ((ph = p.hash) > h)

    dir = -1;

else if (ph < h)

    dir = 1;

else if ((pk = p.key) == k || (k != null && k.equals(pk)))

    return p;

else if ((kc == null &&

          (kc = comparableClassFor(k)) == null) ||

         (dir = compareComparables(kc, k, pk)) == 0) {

    if (!searched) {

        TreeNode<K,V> q, ch;

        searched = true;

        if (((ch = p.left) != null &&

             (q = ch.find(h, k, kc)) != null) ||

            ((ch = p.right) != null &&

             (q = ch.find(h, k, kc)) != null))

            return q;

    }

    dir = tieBreakOrder(k, pk);

}

有两种情况:h小于ph、h大于ph。通常,代码的(pk = p.key) == k || (k != null && k.equals(pk))意思是h等于ph,但我不知道为什么在那之后还有其他的。


当两个对象hashCode彼此相等但又会为假时==,这是什么情况?euqlas()


Object的类覆盖equals()方法什么时候会导致这种情况呢?但是我曾经听说过覆盖也equals()必须覆盖hashCode(),所以这个问题不会发生。


我希望有人能告诉我哪种情况会导致第三次else if。


陪伴而非守候
浏览 144回答 2
2回答

当年话下

两个对象的hashCode互相相等,但是==和equals()会得到false是什么情况?根据Java文档:如果对象相等(即x.equals(y) == true),那么hashCode这些对象也应该相等(即x.hashCode() == y.hashCode())如果两个对象相等hashCode(ie&nbsp;x.hashCode() == y.hashCode()),那么这些对象不必须相等(ie&nbsp;x.equals(y) == true/false)

倚天杖

当两个对象的 hashCode 彼此相等,但是 == 和 equals() 会得到 false 是什么情况?当发生哈希码冲突时。例子考虑这两个多头:Long l1 = 1L;Long l2 = 4294967296L; //which is 2 ^ 32您是否同意存在不同并且equals()会返回false?然而,结果l1.hashCode() == l2.hashCode()是真的。为什么?查看 hashCode 的实现Long:public static int hashCode(long value) {&nbsp; &nbsp; return (int)(value ^ (value >>> 32));}由于 long 可以有 2^64 个值,而 hashcode 的返回值是一个可以有 2^32 个值的 int,所以发生冲突是正常的(每个值都会与 2^32 个其他值发生冲突)。澄清但是我曾经听说 override equals() 也必须覆盖 hashCode() ,所以这个问题不会发生。是的,当您覆盖时,您equals()也应该覆盖hashCode()。这是真的,但我认为你混淆了含义。从hashcode 的 javadoc:如果两个对象根据 equals(Object) 方法相等,则对两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果。如果根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。所以含义a.equals(b) => a.hashCode() == b.hashCode()必须始终为真(如果您的方法正确实施)但相反的含义a.hashCode() == b.hashCode() => a.equals(b)不一定要。
随时随地看视频慕课网APP

相关分类

Java
我要回答