背景
Ojbect的equals方法代表的是引用是否引用的同一對象的相等性測試。
在以下情況下,Object的equals方法是不必覆寫的:
ü 類的每個實例都是獨一無二的。比如說線程,線程代表的是活動實體而不是值。此時Object的equals方法足以是滿足該要求的。
ü 當用戶並不關心邏輯是上的相等性的時候,可以不覆寫equals方法。比如說一般情況下,當兩個學生有相同的名字和學號時,我們都會認爲是同一個人,但是有的人就認爲這是兩個不同的學生,那麼就必要覆寫equals方法。
ü 當父類的equals方法足夠滿足子類的比較時,就不需要覆寫equals方法。比如Set的大部份實現類都繼承調用了AbstractSet中的equals方法。
ü 如果類是私有的或者package-private的話,並且確認這些不會用來測試相等性的時候,就必須覆寫equals方法,如下:
@Override public boolean equals(Object o) {
throw new AssertionError(); // Method is never called
}
何時覆寫equals?
當兩個對象有邏輯上的相等的時候。大部分都是針對類中的屬性來進行相等性比較的。
Object的equals方法的特性
對於Object的equals方法的特性,請查看Java SE的文檔,上面說的幾條規則很清楚,必須遵守。
覆寫equals的注意
1.覆寫的equals方法是否滿足:對稱性、傳遞性、一致性。
2.覆寫了equals方法的同時,一定要覆寫hashCode()。
3.這樣寫public boolean equals(MyObject obj){}是錯誤的,這代表的是重載,而不是覆寫。裏面的參數類型不一樣。所以必須這樣public boolean equals(Object obj){}才正確。