public v put(k key, v value)
final v putval(int hash, k key, v value, boolean onlyifabsent,
boolean evict)
//如果鍊錶中有相同的key直接跳出迴圈
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
break;
p = e;}}
if (e != null)
}++modcount;
if (++size > threshold) //當元素的個數大於進行擴容的操作
resize();
afternodeinsertion(evict);
return null;
}//hashmap最大的容量 1左移30位
static final int maximum_capacity = 1 << 30;
// hashmap的預設容量的大小
static final int default_initial_capacity = 1 << 4; // aka 16
//預設的載入因子
static final float default_load_factor = 0.75f;
//進行擴容的操作
final node resize()
//當前的長度乘以2 並且小於最大長度 並且當前的長度大於 16
//新的擴容限制是老的擴容限制的兩倍
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; //進行對擴容的限制複製
@suppresswarnings()
node newtab = (node)new node[newcap]; //重新設定乙個陣列
table = newtab;
if (oldtab != null)
else
} while ((e = next) != null);
if (lotail != null)
if (hitail != null) }}
}}
return newtab;
}//將鍊錶轉換成樹
final void treeifybin(node tab, int hash)
tl = p;
} while ((e = e.next) != null);
if ((tab[index] = hd) != null)
hd.treeify(tab);}}
//實際轉換為樹的操作
final void treeify(node tab)
else }}
}moveroottofront(tab, root);
}//進行平衡紅黑樹
static treenodebalanceinsertion(treenoderoot,
treenodex)
//當前父節點是黑色或者爺爺的
else if (!xp.red || (xpp = xp.parent) == null)
return root;
if (xp == (xppl = xpp.left))
else
if (xp != null) }}
}else
else
if (xp != null) }}
}}
}//當出現無法進行比較的時候返回乙個系統自身的hashcode的值進行比較
static int tiebreakorder(object a, object b)
//獲取實現comparable泛型的class類
static class<?> comparableclassfor(object x) }}
return null;
}
JAVA集合原始碼分析 HashMap
1 hashmap底層資料結構在1.7之前是陣列 鍊錶而1.8之後是陣列 鍊錶 紅黑樹 2 三個變數 initcapacity 陣列初始容量 loadfactory 載入因子 thresold 3 三個過程 陣列擴容的過程 resize 擴容後原陣列資料轉移到新資料結構的過程 陣列新增元素的過程 p...
HashMap原始碼分析
public hashmap int initialcapacity,float loadfactor 2 接下來是重要的put方法,put方法用於將鍵值對儲存到map中,讓我們來具體分析一下。public v put k key,v value if key null 若key為null,則將va...
HashMap 原始碼分析
1 getentry object key 方法 final entrygetentry object key return null 根據key的hash值計算出索引,得到table中的位置,然後遍歷table處的鍊錶 for entrye table indexfor hash,table.le...