1. 程式人生 > >ArrayList 集合中怎麼插入元素的

ArrayList 集合中怎麼插入元素的

寫一個測試方法,建立一個集合,看看到底是怎麼執行插入操作的。

    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的擴容操作。