從新認識hashmap算法
Hashmap🌩類中有個很重要的字段(Node[]table)這個就是咱們常說的hash桶,本質上這是一個數組,Node是hashmap的內部類,實現了entry接口。。hashmap底層是數組+鏈表的組合形式。數組
Hashmap的put方法。併發
首先根據key值計算hash值,獲得要插入的數組索引i,此時判斷table[i]是否爲空或者null,若是是空或null,就直接插入。插入之後再判斷當前的鍵值對數量是否超過了最大容量,hashmap的最大容量是16,加載因子是0.75,正常狀況下12就會擴容。高併發
而後,如果發現tale[i]不爲null,那麼此時會先比較當前的tale[i]的首個key值和即將插入的key是否相同(此處的相同是指其中的hashcode和equals是否相同)如果相同,則直接覆蓋。code
如果不相同,則開始遍歷table[i],此時在jdk8中引入了紅黑樹的特性,就是說會判斷當前鏈表是否超過8,如果超過了8,則會將鏈表轉化爲紅黑樹,遍歷過程當中,如果發現有相同key值時,則覆蓋,不然在紅黑樹或鏈表中執行插入操做。索引
Hashmap的時間複雜度理想狀態下是O(1),可是考慮到存在hash碰撞,會致使某個數組table[i]下的鏈表出現過長的狀況,那麼此時頗有可能會是O(N)。。爲了不這種狀況出現,儘可能是採用比較好的算法來減小hash碰撞,目前用的最多見的應該是高位運算和取模運算。接口
Hashmap的鏈表插入變化hash
Hashmap在1.7之前採用的是頭插入法,這樣會出現一個問題是會在擴容時改變鏈表元素原先的排列順序,若是此時出現了高併發狀況會致使鏈表成環(鏈表成環會致使陷入死循環),因此在1.8中改成採用尾插入法,這樣就不會改變原有的鏈表元素位置。table
紅黑樹的時間複雜度是hashmap
跟二叉查找樹的時間複雜度是同樣的,執行查找、插入、刪除等操做的時間複雜度爲O(logn)