1. 程式人生 > >java重寫equals方法以及hashcode方法

java重寫equals方法以及hashcode方法

    equals方法重寫需要注意以下幾點:
1:自反性:對任意x,x.equals(x)一定返回true。
2:對稱性:對任意x和y,如果y.equals(x)返回true,則x.equals(y)也返回true。
3:傳遞性:對任意的x,y,和,z,如果x.equals(y)返回true,y.equals(z)返回true,則x.equals(z)也一定返回true。
4:一致性:對任意的x和y,如果物件中用於等價比較的資訊沒有改變,那麼無論呼叫多少次x.equals(y),返回的結果都是一致的。
5:對於任何不是null的x,x.equals(null)一定返回false。
在string類中,利用equals()方法判斷兩個字串是否相等的標準和==不一致,因為在equals()方法中只需要比較兩個字串的值是否一致就可以了,而==則是要根據hashcode來進一步判斷。
object預設提供的equals()方法只是比較兩者的地址,所以object類的equals()方法比較的結果和==的結果完全相同,因此在實際應用中通常需要重寫equals()方法。下面就從幾個比較常見的方法中介紹需要重寫equals()方法的例項,不過還是要想介紹一下hashcode()方法,object類的hashcode()方法是根據物件地址來計算,即根據(System.identityHshCode(Object x)方法的計算結果相同)。
,不過一般情況之下,都是要重寫hashcode()方法,不再讓她計算地址的值。
    需要重寫的地方通常在java集合那一部分,集合的重寫基本上都是同一種方式,其實也可以延伸到很多領域,重寫的程式碼如下:
public boolean equals(Object obj){
    if(this==obj)
     return true;
     if(obj!=null&&obj.getClass()==R.class){
         R r=(R)obj;
         return true;
         }
         return false;
    }
public int hashcode()
{
    return 1;
}
這是一種方式,也是最常見的方式,總是把hashcode的值弄成一致,這樣就只會比較equals()方法,上面的程式碼,R的意思是類R。
下面還有一種方式,來表示出hashcode的值,還是先給出hashcode()方法重寫的規則比較好,如下:
1:在程式執行過程中,同一個物件多次呼叫hashcode方法,返回的值是一樣的。
2:當兩個物件通過equals方法比較返回true時,這兩個hashcode返回的值也應該是一致的。
3:物件中用於equals()方法比較標準的例項變數,都應該用雲端計算hashcode值。
下面是重寫hashcode()方法的一般步驟:
1:把物件中每個有意義的例項變數,計算出一個int值,計算方式我就不列舉了,請自己上網搜一下吧。
2:用第一步計算的多個值組合計算出一個hashcode值並返回,為了避免恰好相等的情形出現,一般寫成:return f1.hashCode()*19+(int)f2*31;都是質數。就不列舉了