Java原始碼解析HashMap的resize函式

2021-09-06 20:24:27 字數 1686 閱讀 2606

hashmap的resize函式,用於對hashmap初始化或者擴容。

首先看一下該函式的注釋,如下圖。從注釋中可以看到,該函式的作用是初始化或者使table的size翻倍。如果table是null,那麼就申請空間進行初始化。否則,因為我們在使用2的指數的擴張,在原來table的每個位置的元素,在新的table中,他們要麼待在原來的位置,要麼移動2的指數的偏移。從這裡可以看出,擴容前table每個位置上如果有多個元素,元素之間組成鍊錶時,在擴容後,該鍊錶中的元素,有一部分會待在原地,剩下的元素會往後移動2的指數的偏移。

/**

* initializes or doubles table size. if null, allocates in

* accord with initial capacity target held in field threshold.

* otherwise, because we are using power-of-two expansion, the

* elements from each bin must either stay at same index, or move

* with a power of two offset in the new table.

** @return the table

*/

接下來看一下resize的**,如下圖。

final 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;

@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;

}

擴容的過程分為兩部分,第一部分是對threshold和table的初始化或者重新計算,第二部分是對hashmap中的元素進行重新放置。初始化的過程比較簡單,基本就是使用預設值,初始化hashmap的各個成員變數。重新計算時,是會申請乙個2倍大小的node陣列,用作的新的hashmap的儲存空間。

之後的過程是,對原來hashmap中的每乙個位置進行遍歷,把該位置上的各個元素重新放置到新的table中。所以在迴圈的過程中,會定義lohead,lotail,hihead,hitail,分別表示留著原地的鍊錶的頭和尾,移動到更高位置的鍊錶的頭和尾。這裡需要注意一點,在jdk1.8中,擴容後鍊錶中元素的順序和擴容前煉表中元素的位置,是相同的,並不會像jdk1.7那樣會發生逆序。

java原始碼解析 List

an ordered collection 有序集合 list 的類資訊 public inte ce list extends collection collection 的類資訊 定義基本的method public inte ce collection extends iterable ite...

java原始碼解析 Map

an object that maps keys to values.a map cannot contain duplicate keys each key can map to at most one value.將鍵對映到值的物件。不能包含重複的鍵 每個鍵最多可以對映乙個值。map 的類資訊 ...

Fabric 原始碼解析 原始碼目錄解析

這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...