一、概覽
hashmap的某個桶位如果儲存的是單向列表,當向這個桶位繼續插入乙個元素的時候,這個桶位元素的數量超過
8時,單項列表會轉化為紅黑樹(同時是乙個雙向列表,jdk1.8之後),且會先轉化為雙向列表:
二、轉化過程
1,執行如下程式,使map底層陣列的某個桶位的單向列表」開始「轉化為紅黑樹
按道理,當map-put的元素超過 8*100 = 800時才會擴容陣列,所以,當map.put(65, "65")時,table[1]的位置將會是:
此時,table[1]的元素數量(9個)超過8(treeify_threshold),這個單向列表會被轉化為紅黑樹,但是受
這個數字的影響,陣列的長度(現在為8)只有擴容到64之後,才會將單向列表會被轉化為紅黑樹;擴容的過程:參考(參考http:還沒寫好)。
當map.put(513, "513")時,table[1]的位置將會是:
此時,table[1]的元素數量(9個)超過8(treeify_threshold),這個單向列表」將會「被轉化為紅黑樹。
2,單向列表轉化為紅黑樹
先轉化為雙向鍊錶,雙向鍊錶轉化為紅黑樹,參考:http:還沒有寫好;
jdk1.8 - hashmap源**如下紅框所示:
e:tab[1],是一條單向鍊錶,如上面陣列的那個示意圖,節點都是node型別,隨著單向列表不斷的遞進,指向的當前單向列表的節點;
hd:head?頭部節點,雙向列表的頭部節點,節點是treenode型別;
tl:tail?尾部節點,雙向列表的尾部節點,節點是treenode型別;
p:e當前指向的單向列表的節點轉化為treenode型別後的節點;
2.1,node和treenode的聯絡與區別
treenode是node的子類,也就是說treenode含有node的所有屬性;
node是乙個含有next屬性的單向列表,treenode是乙個含有next(繼承自node)、prev屬性的雙向鍊錶,同時treenode還是乙個含有left、right、parent屬性的二叉樹,同時treenode還是乙個含有boolean red屬性的紅黑樹(在二叉樹的基礎上)。
2.2,單向列表開始轉化為雙向鍊錶
1,第一次迴圈
2,第二次迴圈
3,第三次迴圈
4,以此類推
總結下來,就是:
a、讓單向列表遞進,使用區域性變數(中間變數)e指向遞進過程中的某個節點;
b、使用中間變數p,根據步驟a中的e構造出乙個雙向鍊錶的節點(當前還沒有掛到雙向列表上);
c、如果雙向鍊錶的尾部為空,即雙向鍊錶沒有任何節點,則讓步驟b中的p既作為頭也作為尾;
如果雙向鍊錶的尾部不為空:則需要將步驟b中的p掛到雙向列表的尾部;
d、最後,由於雙向列表的尾部發生了變化,需要將tl指向新的尾部節點。
C C 整理 單向列表
1 概念 單向鍊錶是鍊錶的一種,其特點是鍊錶的鏈結方向是單向的,對鍊錶的訪問要通過順序讀取從頭部開始。鍊錶是使用指 針進行構造的列表,並且是由乙個個結點組裝起來的,因此又稱為結點列表。其中每個結點都有指標成員變數指向列表中的下乙個結點,head指標指向第乙個結點稱為表頭,而終止於最後乙個指向null...
Josephu問題 單向環形列表
josephu問題 設編號為1,2,n的n個人圍坐一圈,約定編號為k 1 k n 的人從1開始報數,數到m的那個人出列,它的下一位又從1開始報數,數到m的那個人又出列,依次類推,直到所有人出列為止,由此產生乙個出隊編號的序列。根據問題的描述,我們可以使用乙個沒有頭節點的單向環形鍊錶來實現解決這個jo...
將單向有序鍊錶轉化為BST
原題目為 leetcode的 convert sorted list to binary search tree 樹和鍊錶的定義 definition for singly linked list.public class listnode definition for binary tree pu...