ArrayList源碼分析

 把之前的學習筆記整理了一下。寫在博客上面,好方便以後的查看,順便也複習一下,裏面有什麼不對的地方,歡迎大家提出,萌萌噠~大笑

 1.ArrayList是基於數組實現的,是一個動態數組,其容量能自動增長,類似於C語言中的動態申請內存,動態增長內存。

 2. ArrayList不是線程安全的,只能用在單線程環境下,多線程環境下可以考慮用Collections.synchronizedList(List list)函數返回一個線程安全的ArrayList類,也可以使用concurrent併發包下的CopyOnWriteArrayList類。

 3.ArrayList實現了Serializable接口,因此它支持序列化,能夠通過序列化傳輸,實現了RandomAccess接口,支持快速隨機訪問,實際上就是通過下標序號進行快速訪問,實現了Cloneable接口,能被克隆。

4.在使用ArrayList的時候最好估計存儲的最大值。不然要按照Size>>1進行擴容。每次擴容就是通過Array.copyof()及裏面調用的System.copyof()將原來的數組拷貝給一個新的數組。這樣就很影響性能,下面是源代碼:
/**
     * Increases the capacity to ensure that it can hold at least the
     * number of elements specified by the minimum capacity argument.
     *
     * @param minCapacity the desired minimum capacity
     */
    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;			//得到原來的大小
        int newCapacity = oldCapacity + (oldCapacity >> 1);	//講原來的大小進行擴容
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        //MAX_ARRAY_SIZE=Integer.MAX_VALUE - 8 ArrayList最大可分配的容量
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
	//這裏就是進行擴容的關鍵一步
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

上面的代碼就是ArrayList進行擴容的關鍵代碼。

5ArrayList基於數組實現,可以通過下標索引直接查找到指定位置的元素,因此查找效率高,時間複雜度爲O(1),但每次插入或刪除元素,就要大量地移動元素,插入刪除元素的效率低,時間複雜度爲O(n/2)和O( (n-1)/2 ),如果插入和刪除操作很頻繁的話,建議使用鏈表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章