ArrayList原理解析之add(E e)方法分析(jdk1.8)

1.ArrayList的add方法

 ArrayList<Object> list = new ArrayList<>();
        list.add("張三");
        list.add("李四");
        list.add("王五");

2.在add方法中,調用 ensureCapacityInternal()方法,size默認private int size;所以size爲0,
那麼傳遞給ensureCapacityInternal的參數值是1

public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }

3.在ensureCapacityInternal方法中,判斷elementData和DEFAULTCAPACITY_EMPTY_ELEMENTDATA是否相等,因爲是第一次添加所以是相等的,那麼久給minCapacity賦初值爲10(通過max方法可得出)

private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
        }

        ensureExplicitCapacity(minCapacity);
    }

4.//在ensureExplicitCapacity方法中,判斷minCapacity (值爲10)是否大於elementData.length,顯然是大於的,所以進入方法grow(10)

private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

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

5.該方法涉及ArrayList的擴容,重要

private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;//elementData.length大小爲0
        //右移一位還是爲0.右移幾位相當於除以2的幾次冪,左移相當於乘以2的幾次冪
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        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 到此時才被賦初值且大小是10
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

6.elementData[size++] = e;即往數組大小爲10的數組中,索引爲0的下標下添加元素。size大小在計算完成後會自增

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