hashMap資料結構圖:

HashMap特點:
允許一個記錄的鍵為null;
允許多條記錄的值為null;
非線程安全,任意時刻多線程操作hashmap,有可能導緻資料不一緻,可以通過Collections的synchronizedMap來實作Map的線程安全或者使用concurrentHashMap。
HashMap是連結清單+數組結構組成,底層是數組,數組元素是單向連結清單。當産生hash碰撞事件,意味着一個位置插入多個元素,這個時候數組上面就會産生連結清單。
通過hashcode的高16位實作的,能保證數組table的length比較小的時候,保證高低bit都參與到hash計算中,不會有大的開銷。
根據key的hash值進行value内容的查找
put實作:
對key的hashCode()進行hashing,并計算下标( n-1 & hash),判斷該位置元素是否存在,不存在,建立Node元素,存在産生碰撞,則利用key.equals()方法去連結清單或樹中去查找對應的節點。
resize實作:HashMap擴容實作:使用一個新的數組代替已有的容量小的數組。
工作原理總結:
通過hash的方法,通過put和get存儲和擷取對象。存儲對象時,我們将K/V傳給put方法時,它調用hashCode計算hash進而得到bucket位置,進一步存儲,HashMap會根據目前bucket的占用情況自動調整容量(超過Load Facotr則resize為原來的2倍)。擷取對象時,我們将K傳給get,它調用hashCode計算hash進而得到bucket位置,并進一步調用equals()方法确定鍵值對。如果發生碰撞的時候,Hashmap通過連結清單将産生碰撞沖突的元素組織起來,在Java 8中,如果一個bucket中碰撞沖突的元素超過某個限制(預設是8),則使用紅黑樹來替換連結清單,進而提高速度。