重寫equals為啥需要重寫hashCode

2022-03-04 05:33:57 字數 1322 閱讀 9260

以前一直記得重寫equals要把hashcode也要重寫了,但是一直也是沒有搞明白,

最近在看一些東西,覺得有必要記錄一下。

equals是object類的方法,

這個方法的作用是比較兩個物件是否相等的,可能有人會問了,使用==號不就可以比較了,

為啥非得使用equals方法呢。

假設你有乙個student類,系統認為乙個學生的學號只要相同就預設為是同乙個學生,

public class student
如下:

student xiaoming=new student("110");

student xm=new student("110");

如果使用==判斷得到的結果肯定是false,因為這是兩個物件,位址肯定不相同。

如果重寫equals方法

public class student 

}

然後使用equals方法比較(xiaoming.equals(xm))就可以得到true。

因為不重寫hashcode在使用hash集合(hashmap、hashtable、hashset)的時候會出現問題。

如果student類重寫了equals方法沒有重寫hashcode方法:

student xiaoming=new student("110");

student xm=new student("110");

hashmapmap=new hashmap();

map.put(xiaoming,"小明");

map.put(xm,"小明");

執行map.size() 我們想要得到的結果是:1,但是執行的結果是:2 ;

這是因為hashmap首先比較的是兩個物件的hashcode值,如果你沒有重寫student類的hashcode方法,預設是按照物件記憶體的位址進行雜湊運算得到的,這兩個物件的位址肯定不一樣,所以hashmap認為它不是同乙個物件,就放入了集合中。

我們新增hashcode方法的重寫:

public class student 

@override

public int hashcode()

}

再次執行上面的**就得到的結果就是:1;說明已經認為這兩個物件是同乙個了。

大家用ide自動生成,盡量不要自己敲因為很有可能會出錯。

IDEA 重寫equals重寫toString

重寫equals方法 idea中直接輸入eq回車進入重寫方法 第二步如果obj這個物件連學生 student 這個型別都不是,那麼肯定返回false if obj instanceof student 第三步如果是學生型別,強制把obj轉換成學生物件,不轉換預設是objeke student s s...

重寫equals方法

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

equals方法重寫

來自的文章 一 為什麼equals 方法要重寫?判斷兩個物件在邏輯上是否相等,如根據類的成員變數來判斷兩個類的例項是否相等,而繼承object中的equals方法只能判斷兩個引用變數是否是同乙個物件。這樣我們往往需要重寫equals 方法。我們向乙個沒有重複物件的集合中新增元素時,集合中存放的往往是...