亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么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 關注
  • 131 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號