2011-08-07 36 views
1

Equal Objects必須具有相同的哈希碼。根據我的理解,當我們打算在基於散列的數據結構中使用對象時,此聲明是有效的。這是Java文檔中hashcode和equals方法的合同之一。我探討了爲什麼這是說的原因,並期待在implementation of hashtableput方法Equal對象必須具有相同的哈希碼?

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

所以我把它發現了下面的代碼,合同來自上述條件e.hash == hash。我進一步試圖探究爲什麼java在比較兩個對象相等時檢查散列碼。因此,這裏是我的understaing

  • 如果兩個相等的對象都等於hascodes那麼他們可以存儲在同一個桶,這將在以下方面是很好的單桶只查找

  • 其更好地檢查hashcode然後實際調用equals方法,因爲hascode方法比equals方法成本更低,因爲這裏我們只需要比較int值,其中equals方法可能是引發對象字段比較。所以hashcode方法提供了一個額外的過濾器。

如果上述兩個原因都有效,請糾正我的錯誤?

+0

我不認爲'.equals()'用於比較哈希代碼或對象引用。 – BoltClock

+0

當您使用不可變對象並且只計算一次散列碼時,這是一個很好的方法。哦,不要忘記HashTable已被棄用。 –

回答

7
  1. 正確的,只是一個小的修正 - 如果兩個不等對象具有相同的哈希碼。
  2. 不完全是,這是最好先檢查一下,至於不相等的過濾器,但如果你想確保的對象是平等的,你應該叫equals()
+0

嗨MByD,即使兩個不相等的對象具有相同的哈希碼,它們將被存儲在同一個桶中。關於第二點,我同意在比較具有相等方法的鍵之前使用hashcode()方法作爲不等於對象的過濾器 –

3

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

HashMap試圖分配它在桶中的所有對象。當put在地圖上被調用時,它必須決定它將用於給定對象的存儲桶。因此它使用hashCode(以桶的數量爲模)來決定使用哪個桶。然後,一旦找到桶,它必須檢查密鑰是否已經在地圖中。爲此,它將桶中的每個對象與要放入地圖的對象進行比較。要做到這一點,它使用equals。如果找不到該對象,則將其添加到存儲桶中。

hashCode未使用,因爲它比equals快。它的使用是因爲它允許在一組桶中分配密鑰。而且計算hashCode的速度要快一倍,並將該對象與(希望爲)0,同一個桶中的一個或兩個對象進行比較,以便將該對象與已存儲在地圖中的數千個對象進行比較。

+0

我誤解了OP問題中的一個詞,並且您將其引導至此。感謝和+1。 – MByD

0

「我進一步嘗試了Exlpore爲什麼java在比較兩個對象相等時檢查Hashcode」。 Put方法不僅僅是檢查是否相等,它首先試圖縮小這個桶,然後使用equals。這就是爲什麼我們需要將HashCode與Equals結合在一起以便使用bucketed集合。

但是,如果您唯一的目的是檢查兩個對象之間的平等,您將永遠不需要散列碼方法。

Obj1。equals(Obj2)默認情況下不會使用hashcode方法。

0

它是一種通用的契約類型,因此當我們將對象存儲在基於哈希的數據結構中時,我們應始終始終放入或從哈希表中獲取相同的對象。 它是我們創建的一個合約,可以順利進入/放入過程。

相關問題