問:
hashcode存在的意義是啥?
面試官心裏:
考察面試者研究技術的深度,探究精神很重要,這是個好問題,後續還有連環問
答:
hashcode的存在主要是用於查找對象的快捷性,如HashSet,HashMap等存儲對象的結構中,hashcode是用來在hash存儲結構中確定對象的存儲地址的。
Java中比較兩個對象是否相等,會調用object.equals方法,如果兩個對象相同,那麼equals相同,那麼這兩個對象的hashcode一定要相同。
官方api就是這麼寫的:
如果對象的equals方法被重寫,那麼對象的hashCode也要重寫,equals顯示對象相等,那麼兩個對象的hashcode必須一致。
反過來,兩個對象的hashcode相同,並不一定表示兩個對象就相同,也就是不一定要求equals方法返回true,只能夠說明這兩個對象在hash存儲結構中,如Hashtable中,他們“存放在同一個桶裏”。
hashcode相同如何處理?
這是個hash碰撞問題,常見有3中解決辦法
1,HashMap採用的是拉鍊法(JDK1.8以前):
2,還有開放地址法
開放地執法有一個公式:Hi=(H(key)+di) MOD m i=1,2,…,k(k<=m-1)
其中,m爲哈希表的表長。di 是產生衝突的時候的增量序列。如果di值可能爲1,2,3,…m-1,稱線性探測再散列。
如果di取1,則每次衝突之後,向後移動1個位置.如果di取值可能爲1,-1,2,-2,4,-4,9,-9,16,-16,…k*k,-k*k(k<=m/2),稱二次探測再散列。
如果di取值可能爲僞隨機數列。稱僞隨機探測再散列
3,再hash法
當發生衝突時,使用第二個、第三個。。。哈希函數計算地址,直到無衝突
java 8有什麼優化嗎?
紅黑樹
當鏈表中的節點數量大於8時,轉爲紅黑樹存儲有碰撞的對象值(hashmap源碼)。
關鍵點:
1,解決二叉樹極端情況下會形成鏈表而帶來的查找效率問題
2,插入,刪除都會打破平衡,通過左旋,右旋和改變節點顏色來達到自平衡
左旋:
右子節點變爲父節點
右子節點的右子節點變爲兄弟節點
右子節點的左子節點變爲右子節點
右旋:
左子節點變爲父節點
左子節點的左子節點變爲兄弟節點
左子節點的右子節點變爲左子節點
詳細瞭解紅黑樹:
https://www.guoxiongfei.cn/cntech/8804.html