首頁  >  文章  >  Java  >  `equals` 和 `hashCode` 如何協同工作以確保 HashMap 中高效的鍵查找和準確的值檢索?

`equals` 和 `hashCode` 如何協同工作以確保 HashMap 中高效的鍵查找和準確的值檢索?

Patricia Arquette
Patricia Arquette原創
2024-11-01 01:01:01309瀏覽

How do `equals` and `hashCode` work together to ensure efficient key lookup and accurate value retrieval in a HashMap?

理解 HashMap 中 equals 和 hashCode 的相互作用

HashMap 是 Java 中高效鍵值儲存的常用資料結構。它嚴重依賴兩個方法:equals 和 hashCode,它們決定鍵的比較方式以及條目在 HashMap 中的分佈方式。

hashCode 的作用

hashCode( )為 HashMap 中的每個鍵計算唯一的整數雜湊碼。該值決定了 HashMap 中儲存鍵的儲存桶。它減少了查找特定鍵時的搜尋空間,使 get 和 put 操作更加有效率。

equals 的作用

equals() 比較兩個物件平等。在 HashMap 的上下文中,equals() 確定兩個鍵在邏輯上是否相等,即使它們不是相同的物件。如果兩個鍵相等,它們將被映射到同一個儲存桶。

覆蓋 hashCode 和 equals 的影響

hashCode 和 equals 之間的相互作用在決定HashMap 的行為。以下是說明其效果的場景:

1.僅重寫hashCode:

當僅重寫hashCode() 來為邏輯上等效的鍵返回相同的雜湊碼時,按鍵將更均勻地分佈在HashMap 的儲存桶中。但是,仍然會呼叫 equals() 來確定兩個鍵是否相等,因此如果 equals() 不能正確識別邏輯上等效的鍵,則可能會導致不正確的結果。

2.僅重寫equals:

如果僅重寫equals() 並且hashCode() 對於邏輯上等效的鍵返回不同的雜湊碼,則鍵將不會對應到同一個儲存桶。這將導致查找效能變慢,因為需要在每個儲存桶內進行線性搜尋。

3.重寫 hashCode 和 equals:

正確的方法是一致地重寫 hashCode() 和 equals()。 hashCode() 應該為邏輯上相等的鍵傳回相同的雜湊碼,而 equals() 應該為邏輯上相等的物件傳回 true。這確保了高效的鍵查找和準確的值檢索。

範例場景

在範例測試程式碼中,ToDos 類別有一個重寫的 equals() 方法,該方法基於物件進行比較日場上。這確保了代表同一天的不同 ToDos 物件被視為相等。

當 hashCode() 方法取消註解時(所有物件傳回 9),HashMap 將鍵分佈在不同的儲存桶中。由於鍵在邏輯上是等效的(都代表“星期一”),因此 HashMap 會傳回兩個作為大小,因為它將它們視為單獨的條目。

當 hashCode() 方法被註解掉時,所有 ToDos 物件都會獲得預設的 hashCode() 實現,該實現為不同的物件傳回不同的雜湊碼。這會產生三個不同的儲存桶,而 HashMap 正確傳回三個作為大小,因為鍵現在被視為唯一條目。

結論

了解 hashCode 之間的相互作用HashMap 中的 () 和 equals() 對於優化其效能至關重要。透過適當地重寫這些方法,您可以確保基於鍵的邏輯等價性進行高效的鍵查找和準確的值檢索。

以上是`equals` 和 `hashCode` 如何協同工作以確保 HashMap 中高效的鍵查找和準確的值檢索?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn