為什麼重寫就一定需要重寫HashCode方法

2021-07-06 02:48:19 字數 971 閱讀 4368

equals 和 hashcode方法是屬於object的,所以每個物件都有自己的equals 和 hashcode方法。在object中equals方法是用來判斷兩個物件是否是同乙個也就是他們的儲存位址是一樣的。但是往往我們有自己的需要定義equal,所以重寫equals方法很重要!下面來說說equals 和 hashcode的不同。

1. object1.equals (object2)等於true時,hashcode (object1)== hashcode(object2) 一定返回true.

2. hashcode (object1)== hashcode(object2) f返回false, object1.equals (object2)y 一定等於false

如果不重寫equals,那麼比較的將是物件的引用是否指向同一塊記憶體位址,重寫之後目的是為了比較兩個物件的value值是否相等。特別指出利用equals比較八大包裝物件

(如int,float等)和string類(因為該類已重寫了equals和hashcode方法)物件時,預設比較的是值,在比較其它自定義物件時都是比較的引用位址hashcode是用於雜湊資料的快速訪問,如利用hashset/hashmap/hashtable類來儲存資料時,都是根據儲存物件的hashcode值來進行判斷是否相同的。

這樣如果我們對乙個物件重寫了euqals,意思是只要物件的成員變數值都相等那麼euqals就等於true,但不重寫hashcode,那麼我們再new乙個新的物件,當原物件.equals(新物件)等於true時,兩者的hashcode卻是不一樣的,由此將產生了理解的不一致,如在儲存雜湊集合時(如set類),將會儲存了兩個值一樣的物件,導致混淆,因此,就也需要重寫hashcode()

同時還有乙個重要的原因,我們都知道hash衝突是怎麼解決的,用雜湊表!如果兩個物件對應的hashcode相同,那麼衝突的物件自然是放在後面的鍊錶上面。著也就是說明兩個物件的hashcode 相同並不代表兩個物件是相等的,但是兩個物件相同他們的hashcode值一定是相同的。

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

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

為什麼需要重寫doget dopost呢?

在學習servlet的過程中,我們大多時候編碼都是直接繼承httpservlet這個類,並且重寫doget dopost,但是為什麼要重寫這兩個方法?從原始碼來看 從原始碼來看 獲取客戶端向伺服器端傳送資料所依據的協議名稱的string型別 http1.1,http1.0 無論你是http1.1還是...

java面試 為什麼需要重寫equals方法

預設equals在比較兩個物件時,是看他們是否指向同乙個位址的。但有時,希望兩個物件只要是某些屬性相同就認為他們的quals為true。比如 student s1 new student 1,name student s2 new student 1,name 如果不重寫equals的話,他們是不相...