重寫equals的問題

2022-02-16 07:48:05 字數 1728 閱讀 7835

我們都知道,在比較兩個物件是否相同時,會用到equals方法,比如list的contains方法,就會呼叫比較物件的equals方法。前段時間在公司寫的乙個檔案檢視小工具,就用到了equals這個方法。具體是遍歷兩個現個資料夾,如果名稱相同的話,比較它們的檔案大小,大小不同的話就列舉出來。

由於不精通演算法。就用了土方法。遍歷兩個指定的資料夾,把拿到的檔案物件存到兩條列表中。再對乙個列表進行遍歷,然後用list的contains判斷是否是符合要求的檔案,是的話就存到另外乙個list,最後返回出去。

lista_files = getfiles("a_floder");//遍歷兩個指定的資料夾,把拿到的檔案物件存到兩條列表中

list

b_files = getfiles("b_floder");

list

files = new arraylist();//

存同名,不同大小檔案的

for(fileentity f:a_files)

}

下面是我fileentity類重寫equals方法

public

class

fileentity

else

else}}

}

由於重寫了fileentity的equals方法,所以 b_files.contains(f)這句**就會呼叫fileentity的equals方法,按自己重寫的方法進行比較。

但是這裡想說的就是,用instanceof有可能出現問題。

因為 a instanceof b  (如果b是a的父類,也是返回true的),比如下面的**就會出現問題了。假設employee繼承自person

@override       

public

boolean

equals(object obj)

return

false

;

}

如果我們寫

person p = new person(15);//

id為15的人

employee ep1 = new employee(15);//

id為15的員工

employee ep2 = new employee(15);//

id為15的員工

employee ep3 = new employee(16);//

id為16的員工

ep1.equals(eq2);

//結果為true,這個是可以接受的

p.equals(ep1);//

這個結果也為true,我們期望的應該是false.因為id為15的人不一定是id為15的員工

上面的問題就是出在 p.equals(ep1)呼叫的是父類person的equals方法。而父類的equals方法有   obj instanceof person,員工也是人,所以返回的是true,又因為id相同,所就equals返回的就是true了。

因父類使用了instanceof關鍵字來判斷是否是乙個類的例項物件的,這很容易讓子類「鑽空子」,為了避免這個問題,應該使用getclass來代替instanceof進行型別判斷,改變後的**如下,

if(obj instanceof

employee)

//用下面這各種方法避免上面提到的問題

if(this.getclass()==obj.getclass())

重寫Equals 的區別

以c 為例。同一性 x.equals x 為true,通過referenceequals this,obj 實現 自反性 x.equals y y.equals x 通過this.gettype obj.gettype 判斷型別是否相同,再進一步對屬性進行判斷 傳遞性 if x.equals y t...

equals 的重寫規則

自反性 對於任何非null的引用值x,x.equals x 應返回true。對稱性 對於任何非null的引用值x與y,當且僅當 y.equals x 返回true時,x.equals y 才返回true。傳遞性 對於任何非null的引用值x y與z,如果y.equals x 返回true,y.equ...

重寫equals方法

對於重寫equals方法有以下例子 object類中的常用方法。object類是所有類的根類,定義了所有物件都具備的功能。api 應用程式介面 文件 class person extends object 判斷是否是同齡人。這個方法也是在比較兩個person物件是否相等。注意 person類中是否有...