【面試一個個啃】Java面試:Java基礎面試 :hashcode存在的意義是啥?

問:

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章