JDK原始碼分析系列 HashMap 1 8

2021-08-28 08:30:02 字數 3263 閱讀 4679

* 預設的初始化容量,必須是2的n次冪

*/static final int default_initial_capacity = 1 << 4; // aka 16

/*** 最大的容量是2的30次冪

*/static final int maximum_capacity = 1 << 30;

/*** 預設的負載因子

*/static final float default_load_factor = 0.75f;

/*** 鍊錶轉紅黑樹的閥值,當hashmap中某乙個槽位中的鍊錶長度達到了這個閥值,那麼鍊錶可能會轉化為紅黑樹,也可能直接擴容

*/static final int treeify_threshold = 8;

/*** 紅黑樹退化為鍊錶的閥值

*/static final int untreeify_threshold = 6;

/*** 最小的鍊錶轉化為紅黑樹的陣列容量,如果煉表達到了轉紅黑樹閥值,但是陣列(槽)長度還沒有達到該閥值,那麼要先擴容

* 為了避免擴容與樹形化的衝突,該值不小於4*treeify_threshold

*/static final int min_treeify_capacity = 64;

/*** 雜湊桶陣列,首次使用的時候初始化,並根據需要調整大小,分配時,長度始終是2的n次冪

*/transient hashmap.node table;

/*** 保持快取到entryset()

*/transient set> entryset;

/*** hashmap 中實際儲存的 key-value 鍵值對數量

*/transient int size;

/*** 此hashmap結構已經修改的次數,

*/transient int modcount;

/*** 用於判斷是否需要擴容的閥值(capacity * load factor).**/

int threshold;

/*** 負載因子實際大小

*/final float loadfactor;

/**

* 基本的hash鍊錶節點,用於大多數

*/static class nodeimplements map.entry

public final k getkey()

public final v getvalue()

public final string tostring()

public final int hashcode()

public final v setvalue(v newvalue)

public final boolean equals(object o)

return false;}}

/**

* implements map.put and related methods

** @param hash hash for key

* @param key the key

* @param value the value to put

* @param onlyifabsent if true, don't change existing value

* @param evict if false, the table is in creation mode.

* @return previous value, or null if none

*/final v putval(int hash, k key, v value, boolean onlyifabsent,

boolean evict)

//遍歷中發現key已經存在直接覆蓋value並退出迴圈

if (e.hash == hash &&

((k = e.key) == key || (key != null && key.equals(k))))

break;

p = e;}}

//已經存在該key的情況時,將對應的節點的value設定為新的value

if (e != null)

}++modcount;

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

if (++size > threshold)

resize();

afternodeinsertion(evict);

return null;

}

/**

* 初始化或者兩倍雜湊槽的大小。如果為空,根據預設的值初始化。

* 否則,由於是用2的n次冪,則元素的下標或者在和以前一致,或者移動到(當前index + 老capacity)位置

*/final hashmap.node resize()

//新陣列是老陣列的的兩倍

else if ((newcap = oldcap << 1) < maximum_capacity &&

oldcap >= default_initial_capacity)

newthr = oldthr << 1; // double threshold

}else if (oldthr > 0) // initial capacity was placed in threshold

newcap = oldthr;

else

if (newthr == 0)

threshold = newthr;

// 建立容量為newcap的newtab,並將oldtab中的node遷移過來,這裡需要考慮鍊錶和tree兩種情況。

hashmap.node newtab = (hashmap.node)new hashmap.node[newcap];

table = newtab;

if (oldtab != null)

else

} while ((e = next) != null);

// 處理完之後放到新陣列中

if (lotail != null)

if (hitail != null) }}

}}return newtab;

}

JDK原始碼系列 LinkedList

linkedlist是乙個雙向鍊錶,實現了list和deque介面。這意味著linkedlist可以用作列表 佇列 棧 雙端佇列。transient int size 0 大小 transient node first 頭指標 transient node last 尾指標 private stat...

JDK原始碼分析 Vector

vector和arraylist有一定的不同 int newcapacity oldcapacity capacityincrement 0 capacityincrement oldcapacity 從這一句我們可以看出 增長容量 capacityincrement 0 增長倍數 陣列數量 舊容量...

JDK原始碼分析 Collections

1.集合框架圖 hashmap是通過 拉鍊法 實現的雜湊表。它包括幾個重要的成員變數 table,size,threshold,loadfactor,modcount。table是乙個entry陣列型別,而entry實際上就是乙個單向鍊錶。雜湊表的 key value鍵值對 都是儲存在entry陣列...