1.HashMap原理,內部數據結構?
底層使用哈希表(數組加鏈表)來存儲,鏈表過長會將鏈表轉成紅黑樹,以實現在O(logn)時間復雜度內查找
2.講一下HashMap中的put方法過程?
對key求哈希值然后計算下標
如果沒有哈希碰撞則直接放入槽中
如果碰撞了以鏈表的形式鏈接到后面
如果鏈表長度超過閾值(默認閾值是8),就把鏈表轉成紅黑樹
如果節點已存在就替換舊值
如果槽滿了(容量*加載因子),就需要resize
3.HashMap中哈希函數是怎么實現的?還有哪些hash實現方式?
高16bit不變,低16bit和高16bit做異或
(n-1)&hash獲得下標
還有哪些哈希實現方式?(查資料和博客)
4.HashMap如何解決沖突,講一下擴容過程。如果一個值在原數組中,擴容后移動到了新數組,位置肯定改變了,如何定位到這個值在新數組中的位置?
將節點加到鏈表后
容量擴充為原來的兩倍,然后對每個節點重新計算哈希值
這個值只可能在兩個地方:一種是在原下標位置,另一種是在下標為<原下標+原容量>的位置
5.拋開HashMap,哈希沖突有哪些解決方法?
開放地址法,鏈地址法
6.針對HashMap中某個Entry鏈太長,查找的時間復雜度可能達到O(n),如何優化?
將鏈表轉為紅黑樹,JDK1.8已經實現
