1. 程式人生 > 其它 >ArrayList 原始碼解析<一>

ArrayList 原始碼解析<一>

技術標籤:java

Arraylist ,是我們平常使用非常頻繁的一個集合,我們從最常用的方式 開始解析

ArrayList<String> arrlist1 = new ArrayList();

arrlist1.add("1");
arrlist1.add("2");
     ...
     ...
     ...
以此增加11個元素

     ...
     ...
arrlist1.add("10");
arrlist1.add("11");

ArrayList<String> arrlist1 = new ArrayList();初始化物件,呼叫了為空的建構函式,我們來看一下簡化的原始碼。

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{

 /**
     * 預設的初始化容量 為10
     */
    private static final int DEFAULT_CAPACITY = 10;

 /**
 * 預設初始化容量的陣列是一個長度為0的空陣列
 */
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

/**
 * ArrayList元素儲存到的陣列緩衝區。
 */
    transient Object[] elementData; // non-private to simplify nested class access

    private int size;//Arraylist陣列長度


 /**
  * new ArrayList(),初始化空建構函式時,ArrayList的元素陣列 為 預設初始化容量的陣列是一個長度為0的空陣列
  */
    public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }

    /**
     * 陣列長度 是在add的時候才開始初始和擴容
     */
    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // 擴容陣列長度
        elementData[size++] = e;//開始新增元素到陣列
        return true;
    }

/**
     * 保證陣列長度夠新增元素
     */
 private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }

/**
計算擴容容量
*/
  private static int calculateCapacity(Object[] elementData, int minCapacity) {
        //陣列元素是 預設容量的空陣列
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { 
            //DEFAULT_CAPACITY 與當前size比較,size 小與預設陣列長度10 時,返回預設陣列長 
            //度,否則返回 size
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }


    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;//被修改次數的記錄

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);//增加容量
    }

/**
*增加容量以確保其至少可以容納
*/
 private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);//擴容大小為原來陣列長度的1.5倍
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        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);
    }
}

總結:new Arraylist()方式初始化

1 初始化時 預設一個空陣列

2 add的時候去初始化預設容量10 的陣列

3 陣列長度超過10的時候,擴容為原來陣列長度的1.5倍