為什麼重寫equals還要重寫hashcode

2021-09-30 21:02:02 字數 685 閱讀 8494

在定義的類重寫equals方法的同時為什麼一定要重寫jdk本地的hashcode方法呢?

我們從兩者的本質上出發去解決這個問題

hashcode()方法時本地方法,返回的是物件的記憶體位址,object類的equals方法比較的就是物件的記憶體位址,所以說如果equals相等,說明兩個物件的位址也相等;

反之,如果hashcode()的返回值相同,equals會是true嗎?答案是不一定,原因;

雜湊碼在生成的時候產生了衝突

反過來,hashcode不同,equals一定不同;

hash演算法對於查詢元素提供了高效率;

hash演算法可以提高從集合中查詢元素的效率,hashset就是根據hash演算法實現的,往hashset中新增元素時,首先會呼叫元素的hashcode方法得到雜湊值,然後通過元素的雜湊值經過移位等運算,就可以得到該元素在雜湊表(雜湊表)中的位置:

情況1: 如果算出元素儲存的位置目前沒有任何元素儲存,那麼該元素可以直接儲存到該位置上。

情況2: 如果算出該元素的儲存位置目前已經存在有其他的元素了,那麼會呼叫該元素的equals方法與該位置的元素再比較一次,如果equals返回的是true,那麼該元素與這個位置上的元素就視為重複元素,不允許新增,如果equals方法返回的是false,那麼該元素執行新增。

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

首先先來看看不重寫任何方法的結果 可以看出建立的兩個物件所有資訊都是一樣的,說明物件這就是指的同乙個人.可判斷這為false說明這不是同乙個物件.再來看看重寫equals不重寫hashcode的結果 然而重寫了equals,且student.equals student1 返回true,根據hash...

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

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

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

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