我們都知道,在比較兩個物件是否相同時,會用到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方法
publicclass
fileentity
else
else}}
}
由於重寫了fileentity的equals方法,所以 b_files.contains(f)這句**就會呼叫fileentity的equals方法,按自己重寫的方法進行比較。
但是這裡想說的就是,用instanceof有可能出現問題。
因為 a instanceof b (如果b是a的父類,也是返回true的),比如下面的**就會出現問題了。假設employee繼承自person
@overridepublic
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 instanceofemployee)
//用下面這各種方法避免上面提到的問題
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類中是否有...