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