ArrayList 集合中怎麼插入元素的
阿新 • • 發佈:2018-12-21
寫一個測試方法,建立一個集合,看看到底是怎麼執行插入操作的。
public static void test1(){
//建立一個集合
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(7);
list.add(5);
list.add(8);
System.out.println(list);
}
控制檯輸出:[1, 7, 5, 8]
ArrayList 提供了一個add()方法,當我們建立了一個集合物件,直接呼叫add()方法就可以插入指定型別的元素,但是add()方法到底是怎麼向集合中插入元素的呢?下面我們來分析一下。
ensureCapacityInternal(size + 1)
,elementData[size] = e; size++;,這裡的size是ArrayList中定義的表示集合大小的成員變數。
下邊我們看add 呼叫的ensureCapacityInternal方法
elementData,EMPTY_ELEMENTDATA,DEFAULT_CAPACITY都是什麼意思
也就是說當我們建立一個ArrayList集合的時候,預設會給我們分配一個容量為10的陣列,至於怎麼擴容,我們再看 grow方法
注意:這裡傳過來的minCapcatiy的值是size+1,能夠實現grow方法呼叫就肯定是(size+1)>elementData.length的情況,所以size就是初始最大容量或上一次擴容後達到的最大容量,所以才會進行擴容。
newCapacity=oldCapacity+(oldCapacity>>1),這裡就是擴容大小確定的地方,相當於新的最大容量是 size+1+size/2 相當於原來的1.5倍然後加1。我們看到呼叫了Arrays工具類的 copyOf方法。
最後我們看一下System.arraycopy()
方法 ,會發現和remove()刪除集合中的元素用的同一個方法,傳送門arraycopy方法
ArrayList 底層是陣列的形式,所以支援重複元素,如果沒有指定大小,預設容量為10,當超過的預設容量的時候,會進行擴容,按照原來容量的1.5倍加1進行。當存入的集合數量一致增加時,會一直進行擴容操作,所以如果預先知道需要的集合的大小,可以直接建立一個指定大小的ArrayList集合,可以避免重複陣列copy的擴容操作。