HashMap
?
碼源解析
?
添加源碼解析
?
resize()
?
這個方法在putval中執(zhí)行,因為要確保你數(shù)組不是null
?
resize就是重新計算容量;向HashMap對象里不停的添加元素,而HashMap對象內(nèi)部的數(shù)組無法裝載更多的元素時,對象就需要擴(kuò)大數(shù)組的長度,以便能裝入更多的元素;當(dāng)然java里的數(shù)組是無法自動擴(kuò)容的,方法是使用一個新的數(shù)組代替已有的容量小的數(shù)組;就像我們用一個小桶裝
putVal()
首次添加
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
? ? ? ? ? ? ? ? ? ?boolean evict) {
? ? ? ? Node<K,V>[] tab; Node<K,V> p; int n, i;
? ? ? ? if ((tab = table) == null || (n = tab.length) == 0)
? ? ? ? ? ? n = (tab = resize()).length;
? ? ? ? if ((p = tab[i = (n - 1) & hash]) == null)
? ? ? ? ? ? tab[i] = newNode(hash, key, value, null);
? ? ? ??
? ??
? ? ~~~~~
? ??
? ? ? ? ++modCount;
? ? ? ? if (++size > threshold)
? ? ? ? ? ? resize();
? ? ? ? afterNodeInsertion(evict);
? ? ? ? return null;
? ? }
if ((p = tab[i = (n - 1) & hash) == null)
初始化完成后,他會去根據(jù)數(shù)組長度-1與計算的hash碼進(jìn)行與運(yùn)算的出來放的數(shù)組位置,他會去看這個位置有沒有元素
有呢就創(chuàng)建一個Node放到這個位置就可以了
如果不是null那就只能鏈表操作了,那個操作等會說
if (++size > threshold)
? ? ? ?resize();
afterNodeInsertion(evict);
return null;
之后呢,我們要變更size的大小,因為size是記錄有多少個真正的元素在這個數(shù)組中,threshold就是臨界值,我們初始化好了,這個值就是12,這個if呢就是為了判斷,你添加到數(shù)組的元素,你不能大于這個臨界值,那你要是大于了,那我就去擴(kuò)容去了,否則了那就沒事了
afterNodeInsertion(evict);
afterNodeInsertion(evict);
這玩意是為了LinkedHashMap服務(wù)的,是為了保證順序而存在的,在hashmap中沒意義。