底部採用動態陣列實現資料增加,刪除。
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介面,支援快速隨機訪問,實際上就是通過下標序號...