繁体   English   中英

当密钥的哈希码有三种情况大于或小于或等于时,为什么还有其他情况呢?

[英]Why there is other situation when key's hashcode has three situation for greater than or less than or equals to?

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小于phh大于ph 通常,代码(pk = p.key) == k || (k != null && k.equals(pk)) (pk = p.key) == k || (k != null && k.equals(pk))表示h等于ph ,但我不知道为什么还有其他如果在那之后。

当两个对象的hashCode彼此相等时会出现什么情况,但是==euqlas()会得到假?

当Object的类重写equals()方法会导致这种情况吗? 但我用过,听说覆盖equals()必须覆盖hashCode() ,所以这个问题不会发生。

我希望有些人可以告诉我哪种情况会导致第三种else if

当两个对象的hashCode彼此相等时会出现什么情况,但是==和equals()会得到假?

根据Java文档:

  • 如果对象相等(即x.equals(y) == true ),那么这些对象的hashCode也应该相等(即x.hashCode() == y.hashCode()
  • 如果两个对象具有相同的hashCode (即x.hashCode() == y.hashCode() ),则这些对象不必相等(即x.equals(y) == true/false

请参阅Oracle Java Tutorial:Object as a Superclass中的详细信息

当两个对象的hashCode彼此相等时会出现什么情况,但是==和equals()会得到假?

发生哈希码冲突时。

考虑那两个龙:

Long l1 = 1L;
Long l2 = 4294967296L; //which is 2 ^ 32

你是否同意有不同的和equals()会返回false? 但是,结果

l1.hashCode() == l2.hashCode()

是真的。

为什么? 看看Long的hashCode的实现:

public static int hashCode(long value) {
    return (int)(value ^ (value >>> 32));
}

由于long可以有2 ^ 64个值,并且hashcode的返回值是一个可以有2 ^ 32个值的int,因此碰撞是正常的(每个值与2 ^ 32个其他值进行冲突)。


澄清

但我用过,听说覆盖equals()也必须覆盖hashCode(),所以这个问题不会发生。

是的,当你重写equals()你也应该覆盖hashCode() 这是事实,但我认为你混淆了这些含义。 哈希码javadoc

如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果。

如果两个对象根据equals(java.lang.Object)方法不相等,则不需要在两个对象中的每一个上调用hashCode方法必须生成不同的整数结果。 但是,程序员应该知道为不等对象生成不同的整数结果可能会提高哈希表的性能。

所以暗示

a.equals(b) => a.hashCode() == b.hashCode()

必须始终为真(如果你的方法正确实施),但反过来的含义

a.hashCode() == b.hashCode() => a.equals(b)

不一定非得。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM