0.1)本文轉自 core java volume 1, 旨在理清 equals + hashCode方法;
1.1) Object中的 equals 方法用于檢測一個對象是否等于另外一個對象;(在Object類中, 這個方法比較的是內存地址, 判斷的是兩個對象是否具有相同引用)
1.2)看個荔枝:
Hint)
return Objects.equals(name, other.name)         && salary == other.salary         && Objects.equals(hireDay, other.hireDay);1.3)在子類中定義 equals 方法時, 首先調用超類的 equals; 如果檢測失敗,對象就不可能相等, 如果超類中的域都相等, 就需要比較子類中的實例域;
1.4)java語言規范要求 equals 具有以下特性:
1.5)出現的問題+解決方法
Hint)對于數組類型的域, 可以使用靜態的Arrays.equals 方法檢測相應的 數組元素是否相等;
Alert)看個荔枝(下面是實現 equals 方法的一種常見的錯誤):
代碼分析(Analysis):
A2)為了避免發生類型錯誤, 可以使用 @Override 對覆蓋超類的方法進行標記;
@Overridepublic boolean equals(Object other)A3)如果出現了錯誤,并且正在定義一個新方法,編譯器就會給出 錯誤報告;如, 假設將下面的聲明添加到 Employee類中, 就會看到一個錯誤報告, 這是因為這個方法并沒有覆蓋超類Object 中的 任何方法:
@Override public boolean equals(Employee other)3.1)定義:散列碼是由對象導出的一個整型值, 散列碼沒有規律的;如,x和y 是兩個不同的對象, x.hashCode() 和 y.hashCode() 基本上不會相同的;
3.2)String 類的 hashCode 散列碼:
3.2.1)String類通過下列算法計算散列碼:
int hash = 0;for(int i=0;i<length(); i++)hash = 31 * hash + charAt(i);3.2.2) hashCode方法定義在了 Object類, 因此每個對象都有一個默認的散列碼, 其值為對象的存儲地址:
對以上打印結果的分析(Analysis):
3.3)看個荔枝, 下面是 Employee類 的 hashCode方法:
 
3.4)還可以在java7中做兩個改進(imPRovement):
I2)還有一個方法: 需要組合多個散列值, 可以調用 Objects.hash 并提供多個參數,這個方法會對各個參數調用 Objects.hashCode, 并組合這些散列值; 如 Employee.hashCode 的方法可以簡寫為:
public int hashCode(){return Objects.hash(name, salary, hireDay);}Attention)
A2) 如, 如果用定義的Employee.equals 比較雇員的Id, 那么 hashCode就需要散列Id, 而不是 雇員的 姓名或存儲地址;
Hint)如果存在數組類型的域, 那么可以使用靜態的 Arrays.hashCode 方法計算一個散列碼, 這個散列碼由數組元素的散列碼組成;
新聞熱點
疑難解答