1. 程式人生 > >java程式碼優化(二)——如何覆蓋Object的公用方法(equals、hashcode、compareTo、toString)

java程式碼優化(二)——如何覆蓋Object的公用方法(equals、hashcode、compareTo、toString)

覆蓋equals方法時請遵守通用約定

什麼情況需要覆蓋equals方法?

當需要比較的類有自己的邏輯特點時,而Object的equals方法不能達到預期的效果時,就需要覆蓋equals比較類的屬性值。

覆蓋equals方法的通用約定

自反性——對於任何非null的物件x,都滿足x.equals(x)返回true。也就是說物件必須等於自身。

對稱性——對於任何非null的物件x和y,當且僅當x.equals(y)返回true時,y.equals(x)必須返回false。也就是說物件x等於y時,物件y必須也等於物件x。

傳遞性——對於任何非null的物件x、y、z,當x.equals(y)返回true,並且y.equals(z)返回true時,x.equals(z)也必須返回true。也就是說當物件x等於物件y,並且物件y等於物件z時,物件x必須等於物件z。

一致性——對於任何非null的物件x、y,當x.equals(y)返回true,並且物件x、y沒有被修改時,多次呼叫x.equals(y)必須一直返回true,否則一直返回false。

非空性——比較的物件必須為非null的物件。

覆蓋equals方法的幾點建議:

①使用“==”操作符來判斷引用物件是否相等;

②使用instanceof操作符來判斷物件型別是否正確;

④覆蓋equals方法總要覆蓋hashcode方法;

⑤請不要修改equals方法引數中的Object物件;

覆蓋equals時總要覆蓋hashcode

實現hashcode的通用約定:

①只要沒有修改equals比較涉及的屬性,多次呼叫hashcode方法都返回同一個值。

②只要2個物件用equals比較是相等的,那麼它們返回的hashcode值必定相等。

③如果2個物件用equals比較是不想等的,那麼它們返回的hashcode值不一定不想等。