ArrayList原始碼分析 JDK1 8

2021-08-10 01:12:22 字數 1520 閱讀 5859

借助工具類arrays,實現陣列複製

elementdata =arrays.copyof(elementdata, newcapacity);
底層呼叫system.arraycopy()

system.arraycopy(original, 0, copy, 0, math.min(original.length, newlength));
陣列複製在增加和刪除元素時都會呼叫

底層結構:

transient object elementdata;

private

int size;

**一:

如果是預設的空陣列,則大小為0;

如果不是預設空陣列,則大小為10;

如果容量超出,則擴容。

public

void

ensurecapacity(int mincapacity)

}

private

void

ensureexplicitcapacity(int mincapacity)

**二:

具體擴容機制:

新容量擴為舊容量的1.5倍;

若所需最小容量大於新容量,則新容量為所需最小容量;

若所需最小容量大於最大陣列容量max_array_size=integer.max_value-8,則新容量為最大容量integer.max_value;

private

void

grow(int mincapacity)

private

static

inthugecapacity(int mincapacity)

問題一:如果陣列初始容量過小,使用arraylist的主要操作時增加元素,不斷的增加,會出現什麼後果?

陣列需要不斷的進行擴容,擴容的過程就是陣列拷貝system.arraycopy的過程,每一次擴容就會開闢一塊新的記憶體空間和資料的複製移動,這樣勢必對效能造成影響。

那麼在這種以寫為主(寫會擴容,刪不會縮容)場景下,提前預知性的設定乙個大容量,便可減少擴容的次數,提高了效能。

問題二:陣列複製需要開闢記憶體空間嗎?

陣列擴容伴隨著開闢新建的記憶體空間以建立新陣列然後進行資料複製,而陣列複製不需要開闢新記憶體空間,只需將資料進行複製。

如果在已刪除為主的場景下使用list,一直不停的刪除而很少進行增加,那麼會出現什麼情況?再或者陣列進行一次大擴容後,我們後續只使用了幾個空間,會出現上面情況?當然是空間浪費啦啦啦,怎麼辦呢?

/**

* 將底層陣列的容量調整為當前實際元素的大小,來釋放空間。

*/public

void

trimtosize()

}

ArrayList原始碼分析

arraylist是平時使用很多的乙個類,趁有時間,我也閱讀以下原始碼,以幫助自己加深理解。類的層次結構這裡就不列出了,主要分析一下原始碼部分,屬性部分 protected transient int modcount 0 這個屬性是從abstractlist繼承過來的,每次arraylist進行結...

ArrayList原始碼分析

有參建構函式傳入乙個int public arraylist int capacity 如果為0則返回空陣列,否則new 乙個capacity的陣列 array capacity 0 emptyarray.object new object capacity 無參建構函式 public arrayl...

ArrayList原始碼分析

最近因為擁抱變換,所以開始無奈的面試之路。因為在集合的原始碼分析上,出了些問題,所以這段時間,好好重新理一理常用的集合原始碼。版本基於jdk1.7 毫無疑問,提到常用集合。arraylist勢必是第乙個被搬出來的,因此我們就先拿它開刀了。arraylist的初始化,只有在第一次add的時候進行new...