初探ArrayList之添加

1、構造方法

1.建立一個空ArrayList

public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

DEFAULTCAPACITY_EMPTY_ELEMENTDATA爲private static final的Object[],值爲{}數組

2.建立ArrayList對象的時候,把一個Collection或其子類添加進來

public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    }
}

initialCapacity爲初始化容量
EMPTY_ELEMENTDATA也爲private static final的Object[],值爲{}this

3.建立ArrayList對象的時候,把一個Collection或其子類添加進來

public ArrayList(Collection<? extends E> c) {
    elementData = c.toArray();
    if ((size = elementData.length) != 0) {
        // c.toArray()可能沒有正確的返回一個Object數組對象
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    } else {
        // 建立一個空的ArrayList
        this.elementData = EMPTY_ELEMENTDATA;
    }
}

2、添加

添加成功返回boolean類型值code

public boolean add(E e) {
    //字面意思:確保容量存在,計算最小初始容量。
    ensureCapacityInternal(size + 1);  
    elementData[size++] = e;
    return true;
}

若是這個ArrayList是剛剛初始化好的(容量爲0),則爲默認值:10;若容量不固定,則比較size與10的大小,返回最大值。對象

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

    ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
    modCount++;
    // 如今最小容量大小超過如今數組的長度,增加
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}
private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    int newCapacity = oldCapacity + (oldCapacity >> 1);//自增1.5倍
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    if (newCapacity - MAX_ARRAY_SIZE > 0)//大於MAX_ARRAY_SIZE
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // 溢出
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ? //三元表達式,大於MAX_ARRAY_SIZE取整形最大值
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;ci

public static <T> T[] copyOf(T[] original, int newLength) {
    return (T[]) copyOf(original, newLength, original.getClass());
}
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
    // 用新的長度建立一個新數組
    T[] copy = ((Object)newType == (Object)Object[].class)
        ? (T[]) new Object[newLength]
        : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    // 把原數組的內容拷貝到新數組中,並返回新數組
    System.arraycopy(original, 0, copy, 0,
                     Math.min(original.length, newLength));
    return copy;
}
相關文章
相關標籤/搜索