1. 程式人生 > >HashMap底層資料結構--面試

HashMap底層資料結構--面試

下面進行總結:HashMap在1.8之前使用 位桶 + 連結串列 採用連結串列解決衝突,在同一個hash值的連結串列都儲存在同一個連結串列中,隨著桶裡面的數值越來越多,即雜湊值相等的元素越來越多,這時進行查詢就特別慢
HashMap1.8使用的是 位桶 + 連結串列 + 紅黑色 當連結串列長度超過閾值(8)時就轉化成紅黑色儲存,此時查詢效率會大大提高,當連結串列陣列的容量超過載入因子0.75,將連結串列擴大兩倍,將原陣列搬到新的連結串列中儲存。
紅黑樹主要是把原來一個連結串列的資料分成奇偶兩個子連結串列分別掛在新連結串列陣列的雜湊位置,這樣就減少了每個連結串列的長度,增加查詢效率
下面主要是jdk1.8的資料接結構
首先來說一下HashMap與雜湊表
底層圍繞雜湊表展開,雜湊表的核心思想就是採用鍵值對的方式進行儲存,讓記錄的關鍵字與儲存位置建立一一對映,這種對映關係是通過某種函式計算出來的,我們稱之為雜湊函式。
其中雜湊函式有六種實現方式:
前幾種都是針對關鍵字進行計算的
1.直接構造法
2.數學分析法
3.平方取中法
4.摺疊法
5.除留餘數法 (h = k % m)
6.隨機函式法 (利用隨機函式)
其中最常用的當然是除留餘數法
但是採用雜湊儲存方式也會有一定的問題,比如雜湊衝突,解決方式:
1.開放地址法 H = (H + D) %M 根據d的取值不同又可以分為線性探測法和線性再雜湊發和偽隨機序列
2.再雜湊表 H = RH(key)即在地址衝突時計算另一個雜湊函式地址,直到不再發生衝突為止
3.鏈地址法:儲存所有雜湊地址衝突的記錄
4.公共溢位區法:將所有的雜湊地址衝突記錄在溢位表中
HashMap實現採用除留餘數法形式的雜湊函式和鏈地址解決雜湊地址衝突,主要包括資料和連結串列 ,其中連結串列中定義類實現HashMap