如何正確的覆蓋equals和hashCode

2022-08-29 02:42:09 字數 1748 閱讀 9115

public boolean equals(object obj)

public native int hashcode()

public string tostring()

protected native object clone() throws clonenotsupportedexception

protected void finalize() throws throwable

類的方法前加final關鍵字,說明該方法不能被該類的子類重寫。

如果類具有自己特有的「邏輯相等」概念(不同於物件等同的概念),而且超類還沒有覆蓋equals以實現期望的行為,這時候我們就需要覆蓋equals方法。

equals方法實現了等價關係:自反性,對稱性,傳遞性,一致性,非空性(x.equals(null)返回為false

class

student

}

1、編寫完成equals方法之後,應該問自己三個問題:它是否對稱的、傳遞的、一致的。

2、不要將equals宣告中的object物件替換為其他的型別

public

boolean equals(student obj)

這樣相當於過載了equals方法,而非是覆蓋。

hashcode有一條約定如下:

如果兩個物件根據equals(object)方法比較是相等,那麼呼叫這兩個物件中任意乙個物件的hashcode方法都必須產生同樣的整數結果。

下面給出一種簡單的解決辦法:

把某個非零的常數值,比如說17,儲存在乙個名為result的int型別的變數中。

對於物件每個關鍵域f(指equals方法中涉及的每個域),完成以下步驟:

如果該域是boolean型別,則計算(f ? 1 : 0)。

private

boolean flag=true

;int booltemp=flag?0:1;

如果該域是byte、char、short或者int型別,則計算(int)f。

如果該域是float型別,則計算float.floattointbit(f)。

如果該域是long型別,則計算(int)(f ^ (f >>> 32))。

如果該域是double型別

private

double

height;

long heightbits=double.doubletolongbits(height);

int heighttemp=(int)(heightbits ^ (heightbits >>> 32));

如果該域是乙個物件引用,並且該類的equals方法通過遞迴呼叫equals的方式來比較這個域,則同樣為這個域遞迴呼叫hashcode。

private

string name;

int stringtemp=this.name.hashcode();

完整的student類:

class

student

@override

public

inthashcode()

}

如何理解 和equals方法

操作符專門用來比較兩個變數的值是否相等,也就是用於比較變數所對應的記憶體中所儲存的數值是否相同,要比較兩個基本型別的資料或兩個引用變數是否相等,只能用 操作符。如果乙個變數指向的資料是物件型別的,那麼,這時候涉及了兩塊記憶體,物件本身占用一塊記憶體 堆記憶體 變數也占用一塊記憶體,例如 objet ...

Equals 和 的區別

對於值型別,如果物件的值相等,則相等運算子 返回 true,否則返回 false。對於string 以外的引用型別,如果兩個物件引用同乙個物件,則 返回 true。對於 string 型別,比較字串的值。操作比較的是兩個變數的值是否相等。equals 方法比較的是兩個物件的內容是否一致 equals...

equals 和 的區別

equals 方法 是string類從它的超類object中繼承的 被用來檢測兩個物件是否相等,即兩個物件的內容是否相等。用於比較引用 和 比較基本資料型別時具有不同的功能 1.比較基本資料型別,如果兩個值相同,則結果為true 2.而在比較引用時,如果引用指向記憶體中的同一物件,結果為true s...