對象調用 hashCode 方法后,會返回一串 int 類型的數字碼
java 規定:
1. 兩個對象的 hashCode() 相等,那他們的 equals() 不一定相等
2. 兩個對象的 equals() 相等,那他們的 hashCode() 必定相等
3. 重寫 equals() 方法時一定要重寫 hashCode() 方法,無腦寫就 ok?
hashCode的設計初衷是提高哈希容器的性能,equals的效率是沒有hashCode高的
hashCode
hashCode:對象的散列碼,是根據對象的某些信息推導出的一個整數值,默認情況下表示是對象的存儲地址。通過散列碼,可以提高檢索的效率,主要用于在散列存儲結構中快速確定對象的存儲地址
hashCode 提高檢索效率原理:
采用哈希算法(散列算法)來提高從集合中查找元素的效率,將數據按特定算法直接分配到不同區域上。將集合分成若干個存儲區域,每個對象可以計算出一個哈希碼,可以將哈希碼分組(使用不同的hash函數來計算的),每組分別對應某個存儲區域,根據一個對象的哈希碼就可以確定該對象應該存儲在哪個區域,大大減少查詢匹配元素的數量。
?假設 hashCode 為內存值,通過 hashCode 和數組長度取余,得到對象應該存儲的位置,這樣無論是存儲元素還是獲取元素,通過數組下標就只用操作一次
發生哈希沖突時:采用 equals() 判斷是否相等
hashCode() 和 equals() 要同時重寫:
hashCode() 用來定位索引位置,以提高效率的同時可能會發生哈希沖突,當發生哈希沖突時,我們就得通過 equals() 方法判斷沖突的對象是否相等
如果只重寫 hashCode()?方法,那哈希沖突發生時,即使兩個對象相等,也不會被判定為重復,會導致數組里存儲一堆重復對象
如果只重寫 equals() 方法,那兩個相等的對象內存地址不相等,還是會導致存儲一堆重復元素
所以兩個方法最好一起重寫