(一) 真實面試題之:Hashmap的結構,1.7和1.8有哪些區別
不一樣點:
(1)JDK1.7用的是頭插法,而JDK1.8及以後使用的都是尾插法,那麼他們爲何要這樣作呢?由於JDK1.7是用單鏈表進行的縱向延伸,當採用頭插法時會容易出現逆序且環形鏈表死循環問題。可是在JDK1.8以後是由於加入了紅黑樹使用尾插法,可以避免出現逆序且鏈表死循環的問題。面試
(2)擴容後數據存儲位置的計算方式也不同:1. 在JDK1.7的時候是直接用hash值和須要擴容的二進制數進行&(這裏就是爲何擴容的時候爲啥必定必須是2的多少次冪的緣由所在,由於若是隻有2的n次冪的狀況時最後一位二進制數才必定是1,這樣能最大程度減小hash碰撞)(hash值 & length-1)數組
二、而在JDK1.8的時候直接用了JDK1.7的時候計算的規律,也就是擴容前的原始位置+擴容的大小值=JDK1.8的計算方式,而再也不是JDK1.7的那種異或的方法。可是這種方式就至關於只須要判斷Hash值的新增參與運算的位是0仍是1就直接迅速計算出了擴容後的儲存方式。安全
在計算hash值的時候,JDK1.7用了9次擾動處理=4次位運算+5次異或,而JDK1.8只用了2次擾動處理=1次位運算+1次異或。數據結構
擴容流程對比圖:spa
(3)JDK1.7的時候使用的是數組+ 單鏈表的數據結構。可是在JDK1.8及以後時,使用的是數組+鏈表+紅黑樹的數據結構(當鏈表的深度達到8的時候,也就是默認閾值,就會自動擴容把鏈表轉成紅黑樹的數據結構來把時間複雜度從O(n)變成O(logN)提升了效率)線程
(二)哈希表如何解決Hash衝突?3d
(三)爲何HashMap具有下述特色:鍵-值(key-value)都容許爲空、線程不安全、不保證有序、存儲位置隨時間變化blog
(四)爲何 HashMap 中 String、Integer 這樣的包裝類適合做爲 key 鍵hash
(五)HashMap 中的 key若 Object類型, 則需實現哪些方法?效率