hashmap put 方法流程圖
hashmap的put方法流程總結
1、put(key, value)中直接呼叫了內部的putval方法,並且先對key進行了hash操作;
2、putval方法中,先檢查hashmap資料結構中的索引陣列表是否位空,如果是的話則進行一次resize操作;
3、以hashmap索引陣列表的長度減一與key的hash值進行與運算,得出在陣列中的索引,如果索引指定的位置值為空,則新建乙個k-v的新節點;
4、如果不滿足的3的條件,則說明索引指定的陣列位置的已經存在內容,這個時候稱之碰撞出現;
5、在上面判斷流程走完之後,計算hashmap全域性的modcount值,以便對外部併發的迭代操作提供修改的fail-fast判斷提供依據,於此同時增加map中的記錄數,並判斷記錄數是否觸及容量擴充的閾值,觸及則進行一輪resize操作;
6、在步驟4**現碰撞情況時,從步驟7開始展開新一輪邏輯判斷和處理;
7、判斷key索引到的節點(暫且稱作被碰撞節點)的hash、key是否和當前待插入節點(新節點)的一致,如果是一致的話,則先儲存記錄下該節點;如果新舊節點的內容不一致時,則再看被碰撞節點是否是樹(treenode)型別,如果是樹型別的話,則按照樹的操作去追加新節點內容;如果被碰撞節點不是樹型別,則說明當前發生的碰撞在鍊錶中(此時鍊錶尚未轉為紅黑樹),此時進入一輪迴圈處理邏輯中;
8、迴圈中,先判斷被碰撞節點的後繼節點是否為空,為空則將新節點作為後繼節點,作為後繼節點之後並判斷當前鍊錶長度是否超過最大允許鍊錶長度8,如果大於的話,需要進行一輪是否轉樹的操作;如果在一開始後繼節點不為空,則先判斷後繼節點是否與新節點相同,相同的話就記錄並跳出迴圈;如果兩個條件判斷都滿足則繼續迴圈,直至進入某乙個條件判斷然後跳出迴圈;
9、步驟8中轉樹的操作treeifybin,如果map的索引表為空或者當前索引表長度還小於64(最大轉紅黑樹的索引陣列表長度),那麼進行resize操作就行了;否則,如果被碰撞節點不為空,那麼就順著被碰撞節點這條樹往後新增該新節點;
10、最後,回到那個被記住的被碰撞節點,如果它不為空,預設情況下,新節點的值將會替換被碰撞節點的值,同時返回被碰撞節點的值(v)。
HashMap的Put方法(二)
hashmap類中有如下put方法 方法體省略 public v put k key,v value final v putval int hash,k key,v value,boolean onlyifabsent,boolean evict public void putall map ext...
put 方法和write 方法
ostream類提供了put 方法和write 方法,前者用於顯示字元,後者用於顯示字串。put 原型 ostream put char 當前標準與此相同,但被模板化以適應wchar t,返回乙個指向呼叫物件的引用,所以可拼接輸出 include includeusing namespace std...
HashMap之put方法原始碼理解總結
引入 在理解hashmap的put方法之前,需要對hashmap有一些基礎的理解。1.hashmap的資料結構 陣列 鍊錶 紅黑樹 2.put資料的大概流程 1.首次put資料 當定義了乙個hashmap結構,在第一次呼叫put方法進行,新增資料的時候,首先會對hashmap結構進行初始化,生成長度...