Java ArrayList擴容機制

2021-08-26 23:29:48 字數 1766 閱讀 3090

底部採用動態陣列實現資料增加,刪除。

size:arraylist的實際存放資料個數,即我們常說的list長度,size()函式

elementdate:elementdate,arraylist實際存放資料的陣列,可動態擴容,我們所說的就是動態改變elementdate.length,從而達到擴容,實際的size一般都小於elementdate.length。可以通過trimtosize()函式將elementdate的容量改為資料實際的個數,去除多餘的容量。刪除元素並不會改變elementdate容量

transient object elementdata;
三種初始化方式:

//帶初始容量的初始化 

public arraylist(int initialcapacity) else if (initialcapacity == 0) else

}//無參初始化

public arraylist()

//collection作為引數

public arraylist(collection<? extends e> c) else

}

採用無參初始化,elementdata會是乙個空陣列,在新增第乙個資料前,集合的容量為0,當新增第乙個資料時,會進行擴容,將容量擴大為預設容量10。呼叫add()函式新增資料:

public boolean add(e e) 

private static int calculatecapacity(object elementdata, int mincapacity)

return mincapacity;

}private void ensurecapacityinternal(int mincapacity)

private void ensureexplicitcapacity(int mincapacity)

add()函式中size作為當前的elementdata陣列長度, ensurecapacityinternal(int mincapacity)函式,預計擴容為size+1,如果elementdate==defaultcapacity_empty_elementdata,即為空陣列,將容量擴充套件為相應的較大值,不為空擴充套件為size+1。即得到mincapacity(現在需要的的最小容量)

將上面得到的容量值作為引數傳給ensureexplicitcapacity(int mincapacity)函式,將現在所需要的最小容量與elementdata的長度作比較,進行擴容判斷。若容量不足,則呼叫grow()函式擴容

private static final int max_array_size = integer.max_value - 8;

private void grow(int mincapacity)

private static int hugecapacity(int mincapacity)

獲取elementdate的現有長度,將新的容量擴大為之前的1.5倍,與傳入的最小需要的容量比較,獲取合適值,再與max_array_size比較,是否應該獲取更大的空間,如果大於max_array_size會獲取更大的空間。最後arrays.copyof(elementdata, newcapacity)進行加大容量。

新增第1-10個元素時,容量預設10,夠用不會動態增加容量,當加入第11個時,開始動態擴容,原來的1.5被,即15。

arrays.copyof採用system.arraycopy進行陣列擴容。

JAVA Arraylist動態擴容詳解

適atarraylist是基於陣列實現的,是乙個動態陣列,其容量能自動增長。arraylist不是執行緒安全的,只能用在單執行緒環境下。實現了serializable介面,因此它支援序列化,能夠通過序列化傳輸 實現了randomaccess介面,支援快速隨機訪問,實際上就是通過下標序號進行快速訪問 ...

Java ArrayList自動擴容機制

arraylist底層是基於陣列實現的,是乙個動態陣列,自動擴容。arraylist不是執行緒安全的,只能用在單執行緒環境下。實現了serializable介面,因此它支援序列化,能夠通過序列化傳輸 實現了randomaccess介面,支援快速隨機訪問,實際上就是通過下標序號進行快速訪問 實現了cl...

Java ArrayList自動擴容機制

arraylist介紹 arraylist底層是基於陣列實現的,是乙個動態陣列,自動擴容。arraylist不是執行緒安全的,只能用在單執行緒環境下。實現了serializable介面,因此它支援序列化,能夠通過序列化傳輸 實現了randomaccess介面,支援快速隨機訪問,實際上就是通過下標序號...