equals()
equals() 用於比較物件的內容是否相同。通常稱為相等比較,如果沒有重新定義 equals(),則內部會與 == 相同,因此會進行相同比較。因此,如果要正確地進行物件的相等比較,則必須使用 equals()。
hashCode()
hashCode() 用於檢查兩個物件是否為相同的物件。具有與 == 相同的相同比較功能,但 hashCode() 方法會以執行期間物件的唯一整數值作為傳回值。通常會傳回儲存在 Heap 中的物件的記憶體位址。
此方法附加了 native 關鍵字,這表示當在 Java 中使用以其他語言開發的語言時,會使用此關鍵字。
什麼是雜湊?
雜湊是指使用雜湊函數將可變大小的輸入值轉換為固定大小的輸出值的過程。通過雜湊獲得的值稱為雜湊碼。
equals() 和 hashCode()
相同的物件必須具有相同的記憶體位址,因此,相同的物件必須具有相同的雜湊碼,這是不言而喻的。因此,除了 equals() 之外,最好重新定義 hashCode() 以確保具有相同的雜湊碼。
雜湊資料結構
如上所示,讓我們嘗試將兩個相等的物件插入 HashSet 資料結構中。如果列印此 Set 的大小,則會顯示 2。這是為什麼呢?
這是因為使用雜湊的資料結構在決定 Key 時會使用 hashCode()。也就是說,在比較物件是否相同之前,會先比較兩個物件的雜湊碼是否相同,然後再判斷兩個物件是否相等。此時,如果 hashCode() 沒有被重新定義,則會使用 Object 的 hashCode(),因此會傳回每個物件儲存的記憶體位址。因此,在使用雜湊資料結構時,最好除了 equals() 之外,也重新定義 hashCode()。
來源
預期面試問題及答案
為什麼要一起使用 equals() 和 hashCode()?
這是因為使用雜湊的資料結構在決定 Key 時會使用 hashCode()。也就是說,在比較物件是否相同之前,會先比較兩個物件的雜湊碼是否相同,然後再判斷兩個物件是否相等。此時,如果 hashCode() 沒有被重新定義,則會使用 Object 的 hashCode(),因此會傳回每個物件儲存的記憶體位址。因此,在使用雜湊資料結構時,最好除了 equals() 之外,也重新定義 hashCode()。
评论0