为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

陪伴而非守候 2022-05-12 15:03:09
中有一些代码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。
查看完整描述

2 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

两个对象的hashCode互相相等,但是==和equals()会得到false是什么情况?

根据Java文档:

  • 如果对象相等(即x.equals(y) == true),那么hashCode这些对象也应该相等(即x.hashCode() == y.hashCode()

  • 如果两个对象相等hashCode(ie x.hashCode() == y.hashCode()),那么这些对象不必须相等(ie x.equals(y) == true/false


查看完整回答
反对 回复 2022-05-12
?
倚天杖

TA贡献1828条经验 获得超3个赞

当两个对象的 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) {

    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)

不一定要。


查看完整回答
反对 回复 2022-05-12
  • 2 回答
  • 0 关注
  • 143 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号