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

2021-10-08 20:58:25 字數 1048 閱讀 8660

link1,link2,link3,link4,link5,link6

主要是為了提公升雜湊表的效能。因為hashmap 集合類使用了 hashcode() 方法來計算物件在雜湊表中應該儲存的位置,如果不重寫hashcode值一樣的物件。因為new出來的物件即使值相同,儲存位址必不相同。不重寫 hashcode會導致為值相同的物件分別了兩個儲存空間,導致了空間浪費。因此要重寫。

以下是關於hashcode的一些性質:

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

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

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

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

重寫hashcode遵循的五個條件

在改寫equals方法時,也要遵守他們的通用約定(equals方法實現了等價關係):

​ \1. 自反性:x.equals(x) = true;

​ \2. 對稱性:如果有x.equals(y) = true,那麼一定有y.equals(x) = true;

​ \3. 傳遞性:對任意的x,y,z。如果有x.equals(y) = y.equals(z) = true,那麼一定有x.equals(z)= true;

​ \4. 一致性:無論多少次呼叫,x.equals(y)總會返回相同的結果。

​ \5. 非空性(暫定):所有的物件都必須!=null;

上面的只是理論性的說法,更加具體的做法如下:

​ \1. 使用==操作符檢查「實參是否為指向物件的乙個引用」,如果是則返回true;

​ \2. 使用instanceof操作符檢查「實參是否為正確的型別」,如果不是,則返回false;

​ \3. 將實參裝換為正確的型別;

​ \4. 對於該類中的每乙個關鍵域,檢查實參中的域與當前物件中對應的域是否匹配。如果所有測試都成功,則返回true,否則返回false。

​ \5. 方法完成之後,確定equals方法的對稱性,傳遞性,一致性

理解重寫equals一定要重寫hashcode

重寫 override public boolean equals object o if o null this.getclass o.getclass user user user o return objects.equals id,user.id objects.equals usernam...

Docker 為什麼一定要sudo

這個sudo真是煩死人了,每次都要sudosudo,覺得浪費了我大量的時間。但是,當我學習到如何到如何可以不sudo 為什麼要sudo之後,還是覺得sudo好一些吧,於是最後選擇加乙個環境變數,來節約時間。參考文章中給出了幾個非常高水平的處理辦法,我很喜歡,以後來學。1.如何免sudo實現docke...

為什麼規則一定要簡單?

我們生活在各種各樣的規則中,專案中 企業中 社會中,凡是有人的地方就有規則。規則,不論明規則,還是潛規則,都將約束人們的行為。為什麼規則一定要簡單?只有簡單的規則才能體現公正。試想,玩撲克牌,如果撲克牌的規則過於複雜,複雜到多數玩家無法通曉全部規則,還有誰會玩呢?我們把規則搞複雜的目的是什麼呢?是為...