重寫了equals為什麼還要重寫hashcode

2021-10-09 05:11:06 字數 1599 閱讀 2861

首先先來看看不重寫任何方法的結果

可以看出建立的兩個物件所有資訊都是一樣的,說明物件這就是指的同乙個人.可判斷這為false說明這不是同乙個物件.

再來看看重寫equals不重寫hashcode的結果

然而重寫了equals,且student.equals(student1)返回true,根據hashcode的規則,兩個物件相等其雜湊值一定相等,所以矛盾就產生了,他們的hashcode值不同,因此重寫equals一定要重寫hashcode

最後看兩個方法都重寫的結果

此時除了上述結果為true,hashcode值也相等.

**可以粗略的表示為: **

兩個物件相等,hashcode一定相等

兩個物件不等,hashcode不一定不等

hashcode相等,兩個物件不一定相等

hashcode不等,兩個物件一定不等

底層原因是因為hashset或map等集合中判斷元素是否相等用到了hashcode是否相等,所以為避免我們認為相等但是邏輯判斷卻不相等的情況出現,自定義類重寫equals必須重寫hashcode方法.

hashset中存入乙個元素時,hashset會呼叫該物件(存入物件)的hashcode()方法來得到該物件的hashcode()值,然後根據該hashcode值決定該物件在hashset中儲存的位置。簡單的說:hashset集合判斷兩個元素相等的標準是:兩個物件通過equals()方法比較相等,並且兩個物件的hashcode()方法返回值也相等。如果兩個元素通過equals()方法比較返回true,但是它們的hashcode()方法返回值不同,hashset會把它們儲存在不同的位置,依然可以新增成功。hashmap也是一樣的.

為什麼重寫equals還要重寫hashcode

在定義的類重寫equals方法的同時為什麼一定要重寫jdk本地的hashcode方法呢?我們從兩者的本質上出發去解決這個問題 hashcode 方法時本地方法,返回的是物件的記憶體位址,object類的equals方法比較的就是物件的記憶體位址,所以說如果equals相等,說明兩個物件的位址也相等 ...

為什麼重寫equals必須重寫hashCode呢

在理解這個問題時,我認為最先理解的應該是為什麼會重寫equals呢?理解清楚這個的前提下才有必要去理解為什麼需要去重寫hashcode!為什麼需要重寫equals方法呢?我認為是為了適應業務場景的需求而需要對類的equals方法進行重寫,最經典的重寫equals方法的例子莫過於string類了,在o...

為什麼重寫equals一定要重寫hashcode?

link1,link2,link3,link4,link5,link6 主要是為了提公升雜湊表的效能。因為hashmap 集合類使用了 hashcode 方法來計算物件在雜湊表中應該儲存的位置,如果不重寫hashcode值一樣的物件。因為new出來的物件即使值相同,儲存位址必不相同。不重寫 hash...