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()

我的Java學習日記
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
兩種方式進行物件比較,使用Comparator或使用Comparable
併發,多個事情在同一時間段內同時發生 並行,多個事情在同一個時間點上同時發生
Map是由Key-Value所組成的 而Key的部分不能重複,因為是Set
Set 是繼承 Collection API的一個子接口 interface 唯一的限制是不允許重覆的物件存在 所以當不想有相同的物件出現,就可以選擇用Set
程式建立thread,然後會交給硬體中的scheduler去排定執行、切換資源 我們無法強制指定順序,因為電腦有太多任務需要執行,但資源有限,因此會由scheduler去分配、切換資源 電腦能同時執行多項任務
Error分為三種 Compile time error Runtime error 俗稱(Exception) Logical error
兩種方式進行物件比較,使用Comparator或使用Comparable
併發,多個事情在同一時間段內同時發生 並行,多個事情在同一個時間點上同時發生
Map是由Key-Value所組成的 而Key的部分不能重複,因為是Set
Set 是繼承 Collection API的一個子接口 interface 唯一的限制是不允許重覆的物件存在 所以當不想有相同的物件出現,就可以選擇用Set
程式建立thread,然後會交給硬體中的scheduler去排定執行、切換資源 我們無法強制指定順序,因為電腦有太多任務需要執行,但資源有限,因此會由scheduler去分配、切換資源 電腦能同時執行多項任務
Error分為三種 Compile time error Runtime error 俗稱(Exception) Logical error
你可能也想看
Google News 追蹤
Thumbnail
題目敘述 Make Two Arrays Equal by Reversing Subarrays 題目給定兩個輸入陣列,請問能否透過子陣列的反轉讓兩個陣列相等? 子陣列的反轉操作次數不受限制。 如果可以,返回True 如果不行,返回False
※ 常用Object(物件)型態的方法: 拿到object裡面某個key的value(值): 拿到所有屬性: ※ 存取物件屬性:點記法與括號記法 使用點記法 (dot notation) 或括號記法 (bracket notation) 來存取物件的值,以下兩種寫法的結果是一樣的: //
※ 認識變數: 變數(variable)是在程式裡面把東西存起來的概念。 基於不讓電腦每次都需要重新運算,把需要花時間運算的東西先存起來,之後再直接拿出來使用,所以我們需要變數。 變數儲存的位置在電腦裡的記憶體。變數就像是一個箱子,記憶體就像是一個倉庫。箱子的名稱就是變數名稱,箱子的內容物就是
※ 什麼是資料庫正規化?為什麼需要正規化? 什麼是資料庫正規化? 資料庫正規化是一種設計關聯式資料庫的方法,目的是建立良好結構的關聯表,主要目的有二: 去除重複性:建立沒有重複的關聯表。因為重複資料不只浪費資料庫的儲存空間,而且會產生資料維護上的問題。 去除不一致的相依性:資料相依是指關聯表
今天要來嘗試的是,如何不用好用的Array.map 方法,來實現 Array.map 的功能。 What is Array.map map() 方法會建立一個新的陣列,其內容為原陣列的每一個元素經由回呼函式運算後所回傳的結果之集合。 簡單來說就是把陣列內的每一個值,個別跑函式,把新的值回傳出成
Thumbnail
雜湊、編碼和加密雖然在資訊安全中扮演不同的角色,但很多人往往容易搞混它們的用途,本篇文章將帶你了解他們的區別。
Thumbnail
題目敘述 題目會給定一個輸入字串s和一套編碼規則,要求我們針對字串s進行解碼,並且以字串的形式返回答案。 編碼規則: 數字[字串] -> []內的字串以對應倍數做展開,而且允許巢狀編碼。 例如: 3[a] 解碼完就是 aaa 2[bc] 解碼完就是 bcbc 2[a2[b]] = 2
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
題目敘述 題目會給我們一個輸入字串s,題目還保證字串s的長度一定是偶數。 要求我們判定字串s的前半部和後半部是否相似? 在本題中,兩個字串相似的定義為兩個字串都擁有相同的母音英文字母: 註: 母音英文字母為a, e, i, o, u, A, E, I, O, U 題目的原文敘述 測試
Thumbnail
題目敘述 Make Two Arrays Equal by Reversing Subarrays 題目給定兩個輸入陣列,請問能否透過子陣列的反轉讓兩個陣列相等? 子陣列的反轉操作次數不受限制。 如果可以,返回True 如果不行,返回False
※ 常用Object(物件)型態的方法: 拿到object裡面某個key的value(值): 拿到所有屬性: ※ 存取物件屬性:點記法與括號記法 使用點記法 (dot notation) 或括號記法 (bracket notation) 來存取物件的值,以下兩種寫法的結果是一樣的: //
※ 認識變數: 變數(variable)是在程式裡面把東西存起來的概念。 基於不讓電腦每次都需要重新運算,把需要花時間運算的東西先存起來,之後再直接拿出來使用,所以我們需要變數。 變數儲存的位置在電腦裡的記憶體。變數就像是一個箱子,記憶體就像是一個倉庫。箱子的名稱就是變數名稱,箱子的內容物就是
※ 什麼是資料庫正規化?為什麼需要正規化? 什麼是資料庫正規化? 資料庫正規化是一種設計關聯式資料庫的方法,目的是建立良好結構的關聯表,主要目的有二: 去除重複性:建立沒有重複的關聯表。因為重複資料不只浪費資料庫的儲存空間,而且會產生資料維護上的問題。 去除不一致的相依性:資料相依是指關聯表
今天要來嘗試的是,如何不用好用的Array.map 方法,來實現 Array.map 的功能。 What is Array.map map() 方法會建立一個新的陣列,其內容為原陣列的每一個元素經由回呼函式運算後所回傳的結果之集合。 簡單來說就是把陣列內的每一個值,個別跑函式,把新的值回傳出成
Thumbnail
雜湊、編碼和加密雖然在資訊安全中扮演不同的角色,但很多人往往容易搞混它們的用途,本篇文章將帶你了解他們的區別。
Thumbnail
題目敘述 題目會給定一個輸入字串s和一套編碼規則,要求我們針對字串s進行解碼,並且以字串的形式返回答案。 編碼規則: 數字[字串] -> []內的字串以對應倍數做展開,而且允許巢狀編碼。 例如: 3[a] 解碼完就是 aaa 2[bc] 解碼完就是 bcbc 2[a2[b]] = 2
Thumbnail
題目敘述 題目會給定我們兩個整數陣列作為輸入nums1, nums2,要求我們找出兩個陣列的差異值。 找出在nums1但是不在nums2的元素,以陣列的形式放在answer[0]輸出。 找出在nums2但是不在nums1的元素,以陣列的形式放在answer[1]輸出。 題目的原文敘述
Thumbnail
題目敘述 題目會給定我們兩個字串word1 和 word2。 允許我們不限制次數進行下列兩種操作: 任意調換其中兩個字元的位置。 把字串中的某個字元全部置換成另一個字元,同時把另一個字元同時置換成某個字元。(例如把字串中原本的a都換成b,把原本的b都換成a) 問我們能不能通過上述兩項操作,
Thumbnail
題目敘述 題目會給我們一個輸入字串s,題目還保證字串s的長度一定是偶數。 要求我們判定字串s的前半部和後半部是否相似? 在本題中,兩個字串相似的定義為兩個字串都擁有相同的母音英文字母: 註: 母音英文字母為a, e, i, o, u, A, E, I, O, U 題目的原文敘述 測試