Java ArrayList各函式原始碼小結

2021-09-10 14:08:11 字數 1616 閱讀 6781

複製一時爽,一直複製一直爽。

雖然從github複製的,但自己再寫一遍能更好的理解和加深記憶。此文章僅作為個人學習的知識點小結,不做任何其他用途。

arraylist是乙個比較簡單的資料結構,最重要的一點就是它的自動擴容,

可以認為就是我們常說的「動態陣列」。

實際上,arraylist內部就是以陣列實現的,這個陣列有容量限制。超出限制時會增加50%容量,用system.arraycopy()複製到新的陣列,因此最好能給出陣列大小的預估值。預設第一次插入元素時建立大小為10的陣列。(注意:只是容量為10,不是size為10,有區別的

按陣列下標訪問元素—get(i)/set(i,e) 的效能很高,這是陣列的基本優勢。直接在陣列末尾加入元素—add(e)的效能也高,但如果按下標插入、刪除元素—add(i,e), remove(i), remove(e),則要用system.arraycopy()來移動部分受影響的元素,效能就變差了,這是基本劣勢。

在arraylist中增加元素,使用 add 函式。他會將元素放到末尾。具體實現如下:

public

boolean

add(e e)

可以看到其最核心的內容就是ensurecapacityinternal方法 。這個函式其實就是自動擴容機制的核心。然後來看一下他的具體實現:

private

void

ensurecapacityinternal

(int mincapacity)

ensureexplicitcapacity

(mincapacity);}

private

void

ensureexplicitcapacity

(int mincapacity)

private

void

grow

(int mincapacity)

也就是說,當增加資料的時候,如果arraylist的大小已經不滿足需求時,那麼就將陣列變為原長度的1.5倍,之後的操作就是把老的陣列拷到新的陣列裡面。例如,預設的陣列大小是10,也就是說當我們 add 10個元素之後,再進行一次add時,就會發生自動擴容,陣列長度由10變為了15。

array的set和get函式比較簡單,先做index檢查,然後執行賦值或訪問操作,其中rangecheck函式檢查是否越界問題,越界就丟擲異常,中斷執行:

public e set

(int index, e element)

public e get

(int index)

public e remove

(int index)

// 把最後的置null

elementdata[

--size]

= null;

// clear to let gc do its work

return oldvalue;

}

Java ArrayList擴容機制

底部採用動態陣列實現資料增加,刪除。size arraylist的實際存放資料個數,即我們常說的list長度,size 函式 elementdate elementdate,arraylist實際存放資料的陣列,可動態擴容,我們所說的就是動態改變elementdate.length,從而達到擴容,實...

java ArrayList原始碼學習

該類繼承於abstractlist,裡面對於資料和結構的操作如下。trimtosize 更新size,如果size小於 陣列的 lenth,則更新size的大小。public void ensurecapacity int mincapacity 確保容量,如果不夠就擴容成原來的1.5倍 1 pub...

Java ArrayList原始碼分析

private static final int default capacity 10 transient object elementdata 擴容函式 private void grow int mincapacity public static native void arraycopy o...