HashMap實現原理

2021-08-25 05:22:02 字數 1159 閱讀 2842

hashmap底層是通過陣列加鍊表的方式實現的,首先假如定義乙個陣列長度為5,當新增元素時,根據key的hashcode值%5進行取餘,如果餘值為3,則放在陣列的第四個位置,如果第四個位置已經有值,則會發生hash碰撞問題,所以hashmap又採用了鍊錶的方式進行儲存,如果key值存在則覆蓋,如果不存在,則新增;hashmap取值的時候也是一樣,通過key的hashcode值取餘算出陣列的第幾個位置,然後通過equals方法進行一一比對,最終找到對應的value值。在一一對比的時候是消耗效率的,所以存的值越多,效率會越低。

hashmap之所以能一直存資料,是因為map的初始容量是16,也就是2的4次方,載入因子是0.75,當資料總量達到容量的百分之七十五之後,容量會翻倍

2.hashmap死鎖原因及解決方案

hashmap是非執行緒安全的,死鎖一般都是產生於併發情況下。我們假設有兩個程序t1和t2,hashmap的容量為2(當然hashmap的容量肯定不可能是2,這裡只是假設),t1執行緒放入key a.b.c.d.e。在t1執行緒中a、b、c的hash取餘值相同,於是就形成了乙個鍊錶,假設a->c->b,

而d、e的hash取餘值不同,於是hashmap的容量不足,需要新建乙個更大的容量,然後把資料從老的hash表中遷移到新的hash表中(通過refresh方法)。這時t2程序闖進來了,t1暫時掛起,t2程序也準備放入新的key,這時也發現容量不足,也refresh一把,refresh之後的鍊錶結構發生變化,假設變成c->a,之後t1程序繼續執行,鏈結結構為a->c,這時候就形成a.next=c,c.next=a的環形鍊錶。一旦取值進入這個環形鍊錶之後就會陷入死迴圈

解決方案:

使用concurrenthahsmap進行替代,concurrenthashmap是執行緒安全的。可能有人會使用hashtable,hashtable也是執行緒安全的,但hashtable鎖定的是整個hash表,效率相對比較低。而concurrenthashmap可以做到讀取資料不加鎖,並且其內部的結構可以讓其在進行寫操作的時候能夠將鎖的粒度保持盡量的小

3.linkedhashmap的應用

linkedhashmap是hashmap的乙個子類,儲存了記錄順序。如果需要按順序訪問的話可以使用linkedhahsmap。其中一些快取(比如ehcache二級快取)的淘汰策略(lru)就是在linkedhashmap上擴充套件的

HashMap實現原理

hashmap 的get 方法 呼叫get方法返回entry public v get object key getentry方法 final entrygetentry object key 對key int hash key null 0 hash key for entrye table in...

HashMap實現原理

資料結構中有陣列和鍊錶來實現對資料的儲存,但這兩者基本上是兩個極端。陣列儲存區間是連續的,占用記憶體嚴重,故空間複雜的很大。但陣列的二分查詢時間複雜度小,為o 1 陣列的特點是 定址容易,插入和刪除困難 鍊錶儲存區間離散,占用記憶體比較寬鬆,故空間複雜度很小,但時間複雜度很大,達o n 鍊錶的特點是...

HashMap實現原理

public v put k key,v value 如果i索引處的entry為null,表明此處還沒有entry。modcount 將key value新增到i索引處。addentry hash,key,value,i return null 從上面的源 中可以看出 當我們往hashmap中put...