原創|你真的瞭解HashMap嗎?(HashMap源碼分析)

原創|你真的瞭解HashMap嗎?(HashMap源碼分析)


前言

講講hashMap,簡單的東西你還真不一定理解,真心的覺得需要有一篇文章把它給講明白,這樣就再也不怕面試被問到了。

  • HashMap介紹
  • HashMap初始化
  • HashMap擴容機制
  • HashMap數據結構
  • HashMap數據碰撞的解決
  • HashMap使用


一、HashMap介紹

他是基於哈希表的 Map 接口的實現。此實現提供所有可選的映射操作,並允許使用 null 值和 null 鍵。此類不保證映射的順序,特別是它不保證該順序恆久不變。此實現假定哈希函數將元素適當地分佈在各桶之間,可為基本操作(get 和 put)提供穩定的性能。另外,HashMap是非線程安全的,而Hashtable是線程安全的。

HashMap是繼承了AbstractMap類,實現了 Map,Cloneable, Serializable 接口.

原創|你真的瞭解HashMap嗎?(HashMap源碼分析)

二、HashMap初始化

重要參數說明

原創|你真的瞭解HashMap嗎?(HashMap源碼分析)

HashMap初始化的時候就做兩件事,初始化了容量(比作一個桶)的大小為16和負載因子為0.75

原創|你真的瞭解HashMap嗎?(HashMap源碼分析)

三、HashMap擴容機制

負載因子可以理解為飽滿度,負載因子越大,佔用的的空間越小,但是查詢的效率越低。負載因子越小,佔用空間越大,但是會提高查詢效率。這是由數據結構決定的,下面講。

HashMap 的實際容量就是因子*容量,其默認值是 16×0.75=12;這個很重要,對效率有一定影響!當存入HashMap的對象超過這個容量時,HashMap 就會就需要 resize(擴容2倍後重排)。

原創|你真的瞭解HashMap嗎?(HashMap源碼分析)

原創|你真的瞭解HashMap嗎?(HashMap源碼分析)

原創|你真的瞭解HashMap嗎?(HashMap源碼分析)


因為重新創建新的數據,重新計算元素的存儲位置非常的影響性能,所以最好預估元素的多少,在創建HashMap的時候定義它的大小,最好為2的冪數,這樣可以更好的利用空降。

四、HashMap數據結構

HashMap是一個散列桶(數組和鏈表),它存儲的內容是鍵值對key-value映射,數組和鏈表的數據結構,能在查詢和修改方面繼承了數組的線性查詢和鏈表的尋址修改。(橫排表示數組,縱排表示鏈表)


原創|你真的瞭解HashMap嗎?(HashMap源碼分析)


五、HashMap數據碰撞的解決

因為哈希值有哈希衝突的存在,所以不同的key可能有相同的哈希值。這個是後就需要通過鏈表結構來解決問題了。

正常情況,當我們put存儲一個key-value數據的時候,HashMap會計根據key的哈希值計算應該在桶中保存的位置,判斷該位置是否有數據,如果有數據,需要判斷hash和key時候相等,如果相等,新的值替換老的值,並返回老的值。(這個不是“碰撞”,這中情況key是一樣的)

原創|你真的瞭解HashMap嗎?(HashMap源碼分析)


i位置數據為空;或者數據不為空,hash不一樣;或者哈希一樣(哈希碰撞),key不一樣,走下面流程:

下面源碼中,bucketIndex為新的數據在數組中的位置,如果這個位置沒有數據,會保存新數據,並且它在鏈表中的下一數據是null(e為null),如果這個位置已經有數據,會在這個位置保存新的數據,它在鏈表中的下一個數據是老的數據(e)。

原創|你真的瞭解HashMap嗎?(HashMap源碼分析)

假如哈希值不一樣,會產生碰撞嗎?答案是肯定的.

首先我們看一下,hashMap中數據在桶中位置計算方式

原創|你真的瞭解HashMap嗎?(HashMap源碼分析)

“與”運算擴展:

參加運算的兩個數據,按二進制位進行“與”運算。

運算規則:0&0=0;0&1=0;1&0=0;1&1=1;

即:兩位同時為“1”,結果才為“1”,否則為0

舉例說明:

1&(16-1)=1

17&(16-1)=1

所以我們可以理解,當桶的容量是固定的時候,負載因子越大,最大實際容量就會越大,需要保存的數據就越多。“碰撞”的情況出現的情況就會更多,增加了HashMap中鏈表結構中的數據,降低查詢的效率。增加了空間利用率。

相反,當負載因子越小的時候,桶的實際容量就會越小,可以存的數據越少,碰撞情況減少,減少鏈表數據,增加查詢效率。降低了空間利用率。

六、HashMap的簡單使用

原創|你真的瞭解HashMap嗎?(HashMap源碼分析)

搞定!!!!喜歡的朋友可以點個關注,關注不迷路~~·


分享到:


相關文章: