從新編寫equals方法的建議


下面給出編寫一個equals方法的完美建議
1>顯示參數命名爲otherObject,稍後須要將它轉換成另外一個叫作other的變量。
2>檢測this與otherObject是否引用同一個對象:
if(this==otherObject) return true;
這條語句是一個優化。實際上,這是一種常常採用的形式。由於計算這個等是要比一個一個地比較類中全部的域付出的代價小得多。
3>檢測otherobject是否爲null,若是爲null,返回false。這項檢測是頗有必要的。
if(otherObject==null) return false;
4>比較this與otherObject是否屬於同一類。若是equals的語義在每一個子類中有所改變,就使用getClass檢測:
if(getClass()!=otherObject.getClass()) return false;
若是全部的子類都擁有統一的語義,就使用instanceof檢測:
if(!(otherObject instanceOf ClassName)) return false;

5>將otherObject轉換爲相應的類類型變量:
java

ClassName other=(ClassName)otherObject;
6>如今開始對全部須要比較的域進行比較了。使用==比較基本類型域,使用equals比較對象域。若是全部的域都匹配,就返回true;不然返回false。

覆蓋equals時總要覆蓋hashCode
  一個很常見的錯誤根源在於沒有覆蓋hashCode方法。在每一個覆蓋了equals方法的類中,也必須覆蓋hashCode方法。若是不這樣作的話,就會 違反Object.hashCode的通用約定,從而致使該類沒法結合全部基於散列的集合一塊兒正常運做,這樣的集合包括HashMap、HashSet和 Hashtable。
  • 在應用程序的執行期間,只要對象的equals方法的比較操做所用到的信息沒有被修改,那麼對這同一個對象調用屢次,hashCode方法都必須始終如一地返回同一個整數。在同一個應用程序的屢次執行過程當中,每次執行所返回的整數能夠不一致。
  • 若是兩個對象根據equals()方法比較是相等的,那麼調用這兩個對象中任意一個對象的hashCode方法都必須產生一樣的整數結果。
  • 若是兩個對象根據equals()方法比較是不相等的,那麼調用這兩個對象中任意一個對象的hashCode方法,則不必定要產生相同的整數結果。可是程序員應該知道,給不相等的對象產生大相徑庭的整數結果,有可能提升散列表的性能。
相關文章
相關標籤/搜索