java之ArrayList.add


ArrayList添加
    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
elementData[size++] = e :e為傳入的需要存儲的元素,elementData 是ArrayList中存放元素的數組緩存區,當ArrayList初始化時長度為0,當存放第一個元素時,長度為10
    /**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer. Any
     * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
     * will be expanded to DEFAULT_CAPACITY when the first element is added.
     */
    transient Object[] elementData; // non-private to simplify nested class access
ensureCapacityInternal(size + 1) :size為ArrayList的長度,表示當前集合中的元素數量
  private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }
    private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }
minCapacity:表示最小容量,calculateCapacity()方法中邏輯:如果向集合中添加元素時elementData為長度為零的數組,則設置為初始容量為DEFAULT_CAPACITY=10
    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
modCount:修改次數,判斷使用最小容量減去當前數組的長度是否大於零,如果大於零則表示需要擴容,反之當前容量不需要擴容
  private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        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 = Arrays.copyOf(elementData, newCapacity);
    }

grow()為擴容方法,傳入當前容量值,獲取當前數組緩存區的長度,根據當前緩沖區長度進行計算擴容,擴容的數量是當前緩存區長度的1.5倍。最后使用Arrays.copyOf方法進行數組擴容



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM