hashmap源碼分析

HashMap源碼解析

hashmap的數結構

(1)在Java中,數據結構分爲兩種,一種是數組,另外一個是模型指針即引用,全部的數據結構均可以用這兩種基本結構所構造,HashMap就是一個數組和鏈表的結合體,即經過hashcode找到數組中的某一個元素,而後經過key的equals方法在鏈表中找到key的位置對應的value。

(2)當建立一個hashmap的時候,就會初始化一個entry的數組,每個entry的數組元素會持有一個指向下一個元素的引用,這就構成了鏈表。當咱們往hashmap中put元素的是時候,先跟住key的hash值獲得這個元素在數組中的位置(即下標)而後能夠把這個元素放在對應的位置之中了,若是這個位置繼續放其餘的元素,那麼在同一個位子上的元素將以鏈表的形式存放,新加入的放在鏈頭,最早加入的就會放在鏈未,從hashmap之中get元素的時候,首先計算hashmap的key值得hashcode,找到數組中對應位置的某一個元素,而後經過key的equals方法在對應的位置的鏈表中找到須要的元素,其實也就是說,若是每個鏈表的位置只有一個元素,那麼hashmap的get的效率是最高的。

hash算法

(1)首先先算的key的hashcode的值,而後和數組長度-1作一次&,這樣就能夠保證獲得與數組index相同的概率較小,那麼數據在數組上分佈的就比較均勻,也就是碰撞率較小,響應的提升了查詢的效率。算法

hashmap的擴容

(1)當hashmap中的元素愈來愈多的時候,碰撞的概率就會直線上升,爲了提升查詢的效率,就要對hashmap的數組進行擴容,而在hashmap數組擴容時候,原數組中的數據必須從新計算其在新數組中的位置,並放進去,這個過程叫resize,而這個過程十分耗時,因此說,儘可能在聲明的時候,就定義它的大小。

hashmap 源碼解析

(1)hashmap的數據存儲結構數組

transient Entry[] table
hashmap中的key-value都是存在entry數組中的

(2)數據節點entry的數據結構數據結構

entry是一個單向的鏈表,entr,實現了map.entry 的接口,即實現了getkey(),getvalue(),setvalue()
,equals(),hashcode()等這些函數,這些都是基本的讀取/修改key、value 值的函數。

(3)hashmap的構造函數函數

(1. 默認構造函數  hashmap();

  (2. 指定容量大小和加載因子的構造函數 hashmap(int initalcapaciry,float loadFactor)

   (3. 指定容量大小的構造函數 hashmap(int initialcapacity)

   (4. 包含map的構造函數 hashmap(map<? extends K,? extends V> m)

(4) clear()指針

clear()的做用是清空hashmap,它是經過將全部的元素設置爲null來實現的。

(5)containsKey()code

containsKey()的做用是判斷hashmap是否包含key

(6)containsValue()接口

containsValue()的做用是判斷hashmap是否包含值爲value的元素
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息