原始碼分析集合Hashmap

2021-09-12 15:53:43 字數 2272 閱讀 4113

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...