(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的效率是最高的。
(1)首先先算的key的hashcode的值,而後和數組長度-1作一次&,這樣就能夠保證獲得與數組index相同的概率較小,那麼數據在數組上分佈的就比較均勻,也就是碰撞率較小,響應的提升了查詢的效率。算法
(1)當hashmap中的元素愈來愈多的時候,碰撞的概率就會直線上升,爲了提升查詢的效率,就要對hashmap的數組進行擴容,而在hashmap數組擴容時候,原數組中的數據必須從新計算其在新數組中的位置,並放進去,這個過程叫resize,而這個過程十分耗時,因此說,儘可能在聲明的時候,就定義它的大小。
(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的元素