equals 與 hashCode

更新於 發佈於 閱讀時間約 2 分鐘

為何要重寫equals方法

比較兩個Object是否相等時,使用equals方法

不過equals方法,預設是比較兩個物件參數所指的記憶體地址是否相同

和 "==" 兩個等號的功效是一樣的

所以我們才要重寫equals方法

讓它去比較兩個物件的內容,或我們有其他想比較兩物件的特別方式


為何要重寫hashCode方法

HashMap、HashSet這些常用的Hash開頭的Collection(集合數據結構)都會需要用到hashcode

用Object雜湊(hash)過後產生的值(hashcode)去決定應該如何儲存在集合數據結構中

例如儲存到HashMap或HashSet,以HashMap舉例

Map<String, String> map = new HashMap<>();
map.put("TW","Taiwan");
map.put("JP","​Japan");

將 [TW, Taiwan] 和 [JP, Japan] 兩對Key-Value塞入了HashMap

它背後的動作邏輯是:

  1. 將Key值進行Hash雜湊,產生一個整數值。例如字串TW雜湊後可能產生535687的雜湊值。
將產生的hash值儲存在該物件(Object)內部的一個地方。(此時就是存到字串TW中的某個地方)
存在物件(Object)內部是為了方便在之後的操作中可以快速訪問該hash值,而不需要每次都重新計算。
當然,物件的值發生改變時,會自動引用該物件的hashCode方法以重新產生新的hash值。
  1. HashMap 內部維護著一個儲存桶組(bucket array)。根據剛剛Key值產生的hash值,HashMap會將鍵值對(Key-Value)儲存到對應的儲存桶(bucket)中。
儲存桶組是一個array,每個儲存桶(bucket)可以儲存一個或以上的鍵值對(鏈表或紅黑樹)。

儲存桶組的目的是為了幫助HashMap高校地儲存與查找鍵值對。

hash值用於確定儲存位置(哪一個bucket),而bucket的索引用於實際儲存和檢索鍵值對。
儲存桶組的索引(是array,所以有索引) 是根據物件的hash值再計算得出的。
  1. 如果該bucket中已經有其他鍵值對存在,這就是發生了hash衝突。則新來的鍵值對會被添加在鏈表或紅黑樹的最末端。


注意

  • 有重寫equals方法的話,hashCode方法也一定要重寫。反過來則非必須
  • 如果兩個物件的equals方法結果為相等,則它們的hashCode方法結果也必須相同。反過來說,hashCode方法的返回結果相同,equals的結果不一定相同,因為可能是hash衝突。


最後,反正開發工具都能自動產生equals() & hashCode()

留言
avatar-img
留言分享你的想法!
avatar-img
Genos's Coding Diary的沙龍
6會員
19內容數
我的Java學習日記
2023/09/27
兩種方式進行物件比較,使用Comparator或使用Comparable
2023/09/27
兩種方式進行物件比較,使用Comparator或使用Comparable
2023/09/27
併發,多個事情在同一時間段內同時發生 並行,多個事情在同一個時間點上同時發生
2023/09/27
併發,多個事情在同一時間段內同時發生 並行,多個事情在同一個時間點上同時發生
2023/09/26
Map是由Key-Value所組成的 而Key的部分不能重複,因為是Set
2023/09/26
Map是由Key-Value所組成的 而Key的部分不能重複,因為是Set
看更多
你可能也想看
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
沙龍一直是創作與交流的重要空間,這次 vocus 全面改版了沙龍介面,就是為了讓好內容被好好看見! 你可以自由編排你的沙龍首頁版位,新版手機介面也讓每位訪客都能更快找到感興趣的內容、成為你的支持者。 改版完成後可以在社群媒體分享新版面,並標記 @vocus.official⁠ ♥️ ⁠
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
Map 集合特性: 採 key、value 方式存放,key 唯一不能重覆。
Thumbnail
Map 集合特性: 採 key、value 方式存放,key 唯一不能重覆。
Thumbnail
題目會給定一組已經規定好的介面interface,要求我們實作HashSet這種資料結構。也就是一般數學和程式語言中所說的"集合"。
Thumbnail
題目會給定一組已經規定好的介面interface,要求我們實作HashSet這種資料結構。也就是一般數學和程式語言中所說的"集合"。
Thumbnail
班上闖來了一個陌生人!該如何快狠準揪出他?這道經典考題的解法,遠比你想的還要多種 ......
Thumbnail
班上闖來了一個陌生人!該如何快狠準揪出他?這道經典考題的解法,遠比你想的還要多種 ......
Thumbnail
題目:完成解決方案,當第一個參數(String 型別)以第二個參數結尾時(也是 String 型別)返回 true。
Thumbnail
題目:完成解決方案,當第一個參數(String 型別)以第二個參數結尾時(也是 String 型別)返回 true。
Thumbnail
文字處理 101!把輸入內容做小寫轉換是很常見的應用唷~
Thumbnail
文字處理 101!把輸入內容做小寫轉換是很常見的應用唷~
Thumbnail
題目:你的團隊正在開發一個新的高級文本編輯器,你的任務是實現行號功能。請編寫一個函數,該函數接受一個字符串列表作為輸入,並返回每行字符串前面附帶正確的行號。行號從 1 開始計數。格式為 n: 字符串。請注意冒號和空格之間的間隔。
Thumbnail
題目:你的團隊正在開發一個新的高級文本編輯器,你的任務是實現行號功能。請編寫一個函數,該函數接受一個字符串列表作為輸入,並返回每行字符串前面附帶正確的行號。行號從 1 開始計數。格式為 n: 字符串。請注意冒號和空格之間的間隔。
Thumbnail
這題就是經典的考排序驗算法, 不管在教科書、上機考、面試白板題都是一個很基本又滿熱門的題目。 題目會給定一個輸入陣列,要求我們實作一個排序演算法,把陣列元素從小到大排好。
Thumbnail
這題就是經典的考排序驗算法, 不管在教科書、上機考、面試白板題都是一個很基本又滿熱門的題目。 題目會給定一個輸入陣列,要求我們實作一個排序演算法,把陣列元素從小到大排好。
Thumbnail
Leetcode #100: Same Tree 題目會給定兩棵Binary Tree的根結點,要求我們判斷兩棵樹是否一模一樣。 也就是說,形狀相同,節點的數值也相同。
Thumbnail
Leetcode #100: Same Tree 題目會給定兩棵Binary Tree的根結點,要求我們判斷兩棵樹是否一模一樣。 也就是說,形狀相同,節點的數值也相同。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News