爲什麼重寫hashCode 同時equals
hashcode相等只能保證兩個對象在一個HASH表裏的同一條HASH鏈上,繼而通過equals方法才能確定是不是同一對象,
如果結果爲true, 則認爲是同一對象不在插入,否則認爲是不同對象繼續插入。
例:
public int hashCode(){
return num%4
}
結果如下:
模爲0的 4,8,12 在A列,即他們的HashCode是一樣的,都是0
他們雖然HashCode一樣,但值不一樣。
0 | 1 | 2 | 3 |
4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 |
A | B | C | D |
hashCode()的返回值和equals()的關係如下:
1. 如果x.equals(y)返回“true”,那麼x和y的hashCode()必須相等。
2. 如果x.equals(y)返回“false”,那麼x和y的hashCode()有可能相等,也有可能不等。
在java的集合中,判斷兩個對象是否相等的規則是:
1),判斷兩個對象的hashCode是否相等
如果不相等,認爲兩個對象也不相等,完畢
如果相等,轉入2)
(這一點只是爲了提高存儲效率而要求的,其實理論上沒有也可以,但如果沒有,實際使用時效率會大大降低,所)
2),判斷兩個對象用equals運算是否相等
如果不相等,認爲兩個對象也不相等
如果相等,認爲兩個對象相等(equals()是判斷兩個對象是否相等的關鍵)