當重載equals方法時,遵循慣例.
equals不是每個類都必須重載,當以下幾個條件滿足,可以不重載equals.
1. 類的實例只有同一個才被判爲相等. 如Thread類.
2. 不用關心兩個對象是否邏輯相等的時候,或是說比較對象沒有意義.
3.父類已經重載了equals,而且父類的equals也適用於子類,子類就不用重載equals.
4.這是一個私有類或是包內訪問,你確定equals不會被調用.
那什麼時候使用equals呢,當兩個對象之間有邏輯相等的意義的時候,而其父類並沒有重載適合的equals的時候, 換句話說,也就是數據類. 這種類有比較值的需求, 而不是簡單的判斷是不是同一個對象.
然而,對實例化進行控制的數據類型對象,如singleton,不用重載equals.
重載要注意以下幾個原則:
反射,對稱,傳遞,一致
另外,對於null,一定要返回false.
高效的equals可以參考以下幾點.
1. 用==判斷是不是同一個實例.
2. 使用instanceof判斷是不是同一個類型.
3.強制轉化成正確的類型.
4.對每個有比較意義的成員變量都作檢查.
5.當你寫完之後,要問自己,這個函數是不是對稱的,可傳遞的,一致的.
寫完equals後,要注意:
1. 在重載equals後,必須要重載hashCode.
2. 不能簡單的比較一個field是不是相等. 如對File這對類,如果兩個對象打開的是相同內容的文件,此時不應該判斷爲相同.
3.不要用另一個類型來代替參數中的Object,否則這就不是重載.
錯誤例子:
public boolean equals(MyClass o) {
...
}
在編譯前使用@Override 可以使編譯器在不正確的函數簽名時報錯.