簡體   English   中英

相等的對象必須具有相等的哈希碼?

[英]Equal Objects must have equal hashcodes?

相等的對象必須具有相等的哈希碼。 根據我的理解,當我們打算在基於哈希的數據結構中使用對象時,此語句是有效的。 這是Java文檔中哈希碼和equals方法的合同之一。 我探討了為什么要這樣說,並查看了hashtable實現,並在put方法中找到了以下代碼

if ((e.hash == hash) && e.key.equals(key)) 

所以我明白了,合同來自上面的條件e.hash == hash 我進一步嘗試探索為什么在比較兩個對象是否相等時java是否檢查哈希碼。 所以這是我的底線

  • 如果兩個相等的對象具有相等的hascode,則可以將它們存儲在同一存儲桶中,這對於僅在單個存儲桶中查找而言將是一個好習慣

  • 最好檢查哈希碼,然后再實際調用equals方法,因為hascode方法的成本比equals方法便宜,因為在這里,我們只需要比較int值(其中equals方法可能涉及對象字段比較)。 因此,哈希碼方法提供了一個額外的過濾器。

如果以上兩個原因均正確,請糾正我?

  1. 正確,只需進行少量校正-如果兩個不相等的對象具有相同的哈希碼。
  2. 不完全是,最好先檢查一下,作為不等式的過濾器,但是如果要確保對象相等,則應調用equals()

你理解錯了。 equals僅返回一個布爾值(兩個可能的值),並且需要另一個對象進行比較。 hashCode返回一個int(2 ^ 32個可能的值),並且只需要調用該對象。

HashMap嘗試將其持有的所有對象分布在各個存儲桶中。 在地圖上調用put ,它必須確定將用於給定對象的存儲桶。 因此,它使用hashCode (對存儲桶數取模)來決定使用哪個存儲桶。 然后,一旦找到存儲桶,它就必須檢查密鑰是否已在地圖中。 為此,它將存儲桶中的每個對象與要放入地圖中的對象進行比較。 為此,它使用equals 如果找不到該對象,則將其添加到存儲桶中。

不使用hashCode因為它比equals更快。 之所以使用它,是因為它允許在一組存儲桶之間分配密鑰。 而且,一次計算hashCode並將對象與(希望)0(在同一存儲桶中的一個或兩個對象)進行比較的速度要快得多,以將對象與已存儲在地圖中的數千個對象進行比較。

“我進一步嘗試向Exlpore解釋為什么在比較兩個對象是否相等時java是否要檢查Hashcode”。 Put方法不僅檢查相等性,還嘗試首先縮小范圍,然后使用均等值。 這就是為什么我們需要將HashCode與Equals結合使用的原因,以防出現分類收集。

但是,如果您唯一的目的只是檢查兩個對象之間的相等性,則永遠不需要哈希碼方法。

默認情況下,Obj1.equals(Obj2)永遠不會使用哈希碼方法。

它是一種普通的合同類型,因此當我們將對象存儲在基於哈希的數據結構中時,我們應該始終一致地將相同的對象放入哈希表或從哈希表中獲取相同的對象。 它是我們創建的合同,必須遵循,以便順利進行輸入/輸出過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM