* 預設的初始化容量,必須是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陣列...