HashMap的put方法大致流程

1. 首次添加,初始化Map數組,根據key的hashcode找出key的位置,添加value。

2. 根據key的hashcode找出key的位置,如果Map數組中該位置爲空,直接添加。

3. 如果該位置不爲空,針對鏈表和紅黑樹結構

1. key與該位置鏈表的首節點的key相同,覆蓋舊的value

2. 該位置是紅黑樹,在紅黑樹上添加value或者覆蓋舊的value

3. 遍歷鏈表,添加添加value或者覆蓋舊的value,遍歷過程中如果鏈表的節點數達到8

1. 如果Map中的鍵值對數量小於64,對Map進行擴容

2. 大於64,該鏈表調整爲紅黑樹

final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node[] tab; Node p; int n, i; //如果HashMap的節點數組爲空,執行resize(),初始化節點數組 if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; //(n-1)&hash與位操作,可以獲得數組的第i個位置,如果該位置的節點爲空,把key和value組成的節點添加到該位置,注意同時p也指向了該位置的節點 if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null); else { //Node表示是一個鏈表結構 Node e; K k; //當第i個位置的節點不爲空,也就是p節點不爲空時,此時如果要添加的key的hashcode與p節點的hashcode相同,同時key與p節點的key相同,則把e節點指向p。 if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p; //當第i個位置也就是p節點是個紅黑樹時,用key和value構造一個紅黑樹的節點,然後把e節點指向該紅黑樹的節點 else if (p instanceof TreeNode) e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value); else { //當第i個位置的節點不爲空,也就是p節點不爲空時,此時如果要添加的key的hashcode與p節點的hashcode相同,但是key與p節點的key不相同,那就遍歷以p節點爲首的鏈表 for (int binCount = 0; ; ++binCount) { //找到p節點爲首的鏈表的尾節點,在其尾部插入以key和value組成的節點,然後結束遍歷 if ((e = p.next) == null) { p.next = newNode(hash, key, value, null); //如果添加了節點以後,該鏈表的節點個數已達到8個,則進行treeifyBin if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st //該操作會先判斷HashMap的數組長度是否小於64,小於則進行擴容,不小於則把當前鏈表結構調整爲紅黑樹 treeifyBin(tab, hash); break; } //遍歷的過程中,如果鏈表上的某個節點的key的hashcode與要添加的key的hashcode相同,同時這個節點的key與要添加的key相同,則結束遍歷 if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; //遍歷過程中,p節點跟隨者遍歷後移 p = e; } } //e不爲空,說明已經存在key的鍵值對,則用要添加的value覆蓋並返回舊的value值 if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; } } ++modCount; //Hashmap中節點的總數大於閾值(容量 * 加載因子,初始值是16*0.75=12),則進行擴容操作,閾值 if (++size > threshold) resize(); afterNodeInsertion(evict); return null; }

查看原文 >>
相關文章