站長留言

  • ✅ 本站維護及更新歷史紀錄,詳情請參考公告
  • ✅ 有任何意見、想法,歡迎留言給Spicy知道喔
  • ✅ 固定於每周一至周五更新Blogger文章,周末不定期
程式Java

【Java】常用方法:equals()、hashCode()

equals(), hashCode()

tags: Java

Common

  • 定義equals()與hashCode()時,最好別使用狀態會改變的資料成員
  • IDE內建產生equals()及hashCode()功能

equals()

1. == 與 equals

  • ==:比較物件(實體、記憶體空間)是否相同
  • equals( ):比較物件的值(value)是否相同
  • Object class 預設的equals( ):功能如同==,用來比較兩個物件內存是否相等
  • Value Class(Integer, String…)的equals( ):已被override用來比較值相等

2. override equals() 基本原則

  • Reflexivity 自反性:x.equals(x) → true
  • Symmetry 對稱性:x.equals(y) → true 則 y.equals(x) → true
  • Transitivity 傳遞性:若 x.equals(y) → true、y.equals(z) → true,則 x.equals(z) → true
  • Consistency 一致性:只要比較的對象不變,多次比較結果必相同
  • Non-nullity 非空性:x.equals(null) 必回傳 false

hashCode()

1. 概念

  • 主要用來增加存取效率及助於判定檔案是否遭受竄改的一種演算法
  • 具有不可逆 (無法逆向演算回原本的數值) 的性質

2. Collection

  • 同時利用equals()與hashCode()來判斷是否加入的是(實質上)相同的物件,例如:HashMap, HashSet, HashTable
  • 常使用的比對方法:contains()
  • override equals()的Class中,也要記得override hashCode()

3. 原則

  • 只要equals()中所用到的變數沒有被修改,hashCode()必須產生相同的結果
  • 如果兩個物件的equals()比較結果是相等的,兩個物件的hashCode()必須產生相同的整數結果
  • 兩個物件的equals()比較結果是不相等的,調用任一hashCode不一定要產生相同的整數結果

4. Example

  • Map的結構能夠快速找到一個對象,而不是進行較慢的線性查找。使用hash過的鍵來定位對象分兩步。Map可以看作是數組的數組。
  • 第一個數組的索引就是對鍵採用hashCode()計算出來的值
  • 再在這個位置上查找第二個數組,使用鍵的equals()方法來進行線性查找,直到找到要找的對象。

Reference 參考資料

  1. equals() & hashCode() in Java:
    https://medium.com/joe-tsai/equals-hashcode-4480f4580be4
  2. 物件相等性(上),參考最底下留言的部分:
    http://www.codedata.com.tw/java/object-equality-1/
  3. Java中的equals()和hashCode()契约:http://www.importnew.com/8701.html
  4. 雜湊桶:
    https://www.jitendrazaa.com/blog/java/what-is-the-need-to-override-hashcode-and-equals-method/
  5. HashMap:
    https://techestate.wordpress.com/2013/02/09/hashcode-and-equals-methods/

沒有留言:

張貼留言

本網站建議使用電腦或平板瀏覽