jdk1.8 HashMap 實現 數組+鏈表/紅黑樹

轉載至 http://www.cnblogs.com/leesf456/p/5242233.htmlhtml

1、前言數組

  在分析jdk1.8後的HashMap源碼時,發現網上好多分析都是基於以前的jdk,而Java8的HashMap對以前作了較大的優化,其中最重要的一個優化就是桶中的元素再也不惟一按照鏈表組合,也可使用紅黑樹進行存儲,總之,目標只有一個,那就是在安全和功能性完備的狀況下讓其速度更快,提高性能。好~下面就開始分析源碼。安全

2、HashMap數據結構數據結構

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  說明:上圖很形象的展現了HashMap的數據結構(數組+鏈表+紅黑樹),桶中的結構多是鏈表,也多是紅黑樹,紅黑樹的引入是爲了提升效率。因此可見,在分析源碼的時候咱們不知不覺就溫習了數據結構的知識點,一箭雙鵰。函數

3、HashMap源碼分析源碼分析

  3.1 類的繼承關係 佈局

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

  能夠看到HashMap繼承自父類(AbstractMap),實現了Map、Cloneable、Serializable接口。其中,Map接口定義了一組通用的操做;Cloneable接口則表示能夠進行拷貝,在HashMap中,實現的是淺層次拷貝,即對拷貝對象的改變會影響被拷貝的對象;Serializable接口表示HashMap實現了序列化,便可以將HashMap對象保存至本地,以後能夠恢復狀態。性能

  3.2 類的屬性 優化

 

 View Code

 

 

  說明:類的數據成員很重要,以上也解釋得很詳細了,其中有一個參數MIN_TREEIFY_CAPACITY,筆者暫時還不是太清楚,有讀者知道的話歡迎指導。spa

  3.3 類的構造函數

  1. HashMap(int, float)型構造函數

 View Code

  說明:tableSizeFor(initialCapacity)返回大於initialCapacity的最小的二次冪數值。

 View Code

  說明:>>> 操做符表示無符號右移,高位取0。

  2. HashMap(int)型構造函數。

 View Code

  3. HashMap()型構造函數。

 View Code

  4. HashMap(Map<? extends K>)型構造函數。

 View Code

  說明:putMapEntries(Map<? extends K, ? extends V> m, boolean evict)函數將m的全部元素存入本HashMap實例中。 

 View Code

  3.4 重要函數分析

  1. putVal函數  

 View Code

  說明:HashMap並無直接提供putVal接口給用戶調用,而是提供的put函數,而put函數就是經過putVal來插入元素的。

  2. getNode函數

 View Code

  說明:HashMap並無直接提供getNode接口給用戶調用,而是提供的get函數,而get函數就是經過getNode來取得元素的。

  3. resize函數  

 View Code

  說明:進行擴容,會伴隨着一次從新hash分配,而且會遍歷hash表中全部的元素,是很是耗時的。在編寫程序中,要儘可能避免resize。

  在resize前和resize後的元素佈局以下

  說明:上圖只是針對了數組下標爲2的桶中的各個元素在擴容後的分配佈局,其餘各個桶中的元素佈局能夠以此類推。

4、針對HashMap的思考

  4.1. 關於擴容的思考

  從putVal源代碼中咱們能夠知道,當插入一個元素的時候size就加1,若size大於threshold的時候,就會進行擴容。假設咱們的capacity大小爲32,loadFator爲0.75,則threshold爲24 = 32 * 0.75,此時,插入了25個元素,而且插入的這25個元素都在同一個桶中,桶中的數據結構爲紅黑樹,則還有31個桶是空的,也會進行擴容處理,其實,此時,還有31個桶是空的,好像彷佛不須要進行擴容處理,可是是須要擴容處理的,由於此時咱們的capacity大小可能不適當。咱們前面知道,擴容處理會遍歷全部的元素,時間複雜度很高;前面咱們還知道,通過一次擴容處理後,元素會更加均勻的分佈在各個桶中,會提高訪問效率。因此,說盡可能避免進行擴容處理,也就意味着,遍歷元素所帶來的壞處大於元素在桶中均勻分佈所帶來的好處。若是有讀者有不一樣意見,也歡迎討論~

相關文章
相關標籤/搜索