複製一時爽,一直複製一直爽。arraylist是乙個比較簡單的資料結構,最重要的一點就是它的自動擴容,
雖然從github複製的,但自己再寫一遍能更好的理解和加深記憶。此文章僅作為個人學習的知識點小結,不做任何其他用途。
可以認為就是我們常說的「動態陣列」。
實際上,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...