搞不懂 HashMap?只因你缺一個 HashMap 的流程圖!

不少人搞不懂 HashMap,我認爲究其緣由是他們的學習方法不對!今天我總結了一個關於 HashMap 的 put 方法執行過程,分享給你們!面試

面試的時候,HashMap 基本上是必問的知識點。數組

不少人在回答的時候,照本宣科。HashMap 根據鍵的 hashCode 值存儲數據,大多數狀況下能夠直接定位到它的值,於是具備很快的訪問速度,但遍歷順序倒是不肯定的。HashMap 最多隻容許一條記錄的鍵爲 null,容許多條記錄的值爲 null。HashMap 非線程安全,即任一時刻能夠有多個線程同時寫 HashMap,可能會致使數據的不一致。若是須要知足線程安全,能夠用 Collections 的synchronizedMap 方法使 HashMap 具備線程安全的能力,或者使用 ConcurrentHashMap。安全

我一眼就能看出,他是在面試以前作了功課。並非真正的懂 HashMap,一個 put 方法就把他打回原形了!ide

學習好的人爲何學習好?由於別人善於總結!好了,廢話很少說,看個人圖!學習

搞不懂 HashMap?只因你缺一個 HashMap 的流程圖!

簡單的來講,能夠用下面幾句話總結!線程

①.判斷鍵值對數組 table[i] 是否爲空或爲 null,不然執行 resize() 進行擴容;blog

②.根據鍵值 key 計算 hash 值獲得插入的數組索引 i,若是 table[i]==null,直接新建節點添加,轉向⑥,若是 table[i] 不爲空,轉向③;索引

③.判斷 table[i] 的首個元素是否和 key 同樣,若是相同直接覆蓋 value,不然轉向④,這裏的相同指的是 hashCode 以及 equals;hash

④.判斷 table[i] 是否爲 treeNode,即 table[i] 是不是紅黑樹,若是是紅黑樹,則直接在樹中插入鍵值對,不然轉向⑤;it

⑤.遍歷 table[i],判斷鏈表長度是否大於8,大於8的話把鏈表轉換爲紅黑樹,在紅黑樹中執行插入操做,不然進行鏈表的插入操做;遍歷過程當中若發現 key 已經存在直接覆蓋 value 便可;

⑥.插入成功後,判斷實際存在的鍵值對數量size是否超多了最大容量 threshold,若是超過,進行擴容。

一樣的,當你把 HashMap 的其餘的方法都畫出流程圖,你會發現全部的東西都是那麼的簡單!

相關文章
相關標籤/搜索