HashMap的底層原理

2021-10-06 02:27:32 字數 1120 閱讀 7618

一、hashmap的資料結構

因為陣列的儲存區間是連續的,占用記憶體嚴重,故空間複雜度比較大,但其二分查詢的時間複雜度小,陣列有定址容易、插入和刪除困難的特點。

而鍊錶儲存空間離散,占用記憶體比較寬鬆,故空間複雜度小,但時間複雜度較大,鍊錶有定址困難、插入和刪除容易的特點。

hashmap的資料結構是雜湊表(用拉鍊法構造雜湊表),這種方式綜合了陣列和鍊錶兩者的特性。建立乙個鍊錶陣列,陣列中每一格就是乙個鍊錶,若遇到雜湊衝突,就將衝突的值加到鍊錶中。

構造雜湊表的幾種方法:

(1)直接定址法:取關鍵字的某個線性函式為雜湊位址,hash(key)= key 或 hash(key)= a*key + b,a、b為常數。優點:簡單、均勻、不會產生衝突;但需事先知道關鍵字的分布情況,適合表較小但連續的情況。在現實應用中,雖簡單但不常用。

(2)除留餘數法:取關鍵值被某個不大於雜湊表長m的數p除后的所得的餘數為雜湊位址。hash(key)= key % p。

(3)平方取中法

(4)摺疊法

(5)隨機數法

(6)數字分析法

解決雜湊衝突的三種方法:

(1)拉鍊法

(2)開放位址法:線性探測(衝突發生時,順序檢視表中下一單元,直到找到乙個空單元或查遍全表)、二次探測、偽隨機探測

(3)再雜湊法:就是再使用雜湊函式去雜湊乙個輸入的時候,輸出是同乙個位置就再次雜湊,直至不發生衝突位置。

二、hashmap的訪問實現

1、hashmap的儲存:

如:若鍵值對a進來,通過計算其key的雜湊得到的index=0,記做:entry[0] = a;一會後又進來乙個鍵值對b,通過計算其index也等於0,hashmap會這樣做:b.next = a,entry[0] = b,如果又進來c,index也等於0,那麼c.next = b,entry[0] = c;這樣我們發現index=0的地方其實訪問了a,b,c三個鍵值對,他們通過next這個屬性鏈結在一起。也就是說陣列中儲存的是最後插入的元素。

2、取hashmap:

先定位到陣列元素,再遍歷該元素處的鍊錶。

HashMap底層原理

1.hashmap概述 hashmap是基於雜湊表的map介面的非同步實現。此實現提供所有可選的對映操作,並允許使用null值和null鍵。此類不保證對映的順序,特別是它不保證該順序恆久不變。2.hashmap的資料結構 注意,迭代器的快速失敗行為不能得到保證,一般來說,存在非同步的併發修改時,不可...

HashMap底層原理

hashmap實現map介面,非執行緒安全的,區別於concurrenthashmap。允許使用null值和null鍵,不保證對映的順序.底層資料結構是乙個 陣列 鍊錶 紅黑樹 put 根據key計算得到key.hash h k.hashcode h 16 根據key.hash計算得到桶陣列的索引i...

HashMap底層原理

預設負載因子 static final float default load factor 0.75f 無參構造 public hashmap 有參構造 public hashmap int initialcapacity public hashmap int initialcapacity,flo...