ArrayList源碼解析思惟導圖

ArrayList源碼解析思惟導圖

常見相關問題


  1. 經過 ArrayList() 構造一個空集合,初始長度是爲0的
  2. 第 1 次添加元素,會建立一個長度爲10的數組,並將該元素賦值到數組的第一個位置
  3. 第 2 次添加元素,集合不爲空,並且因爲集合的長度size+1是小於數組的長度10,因此直接添加元素到數組的第二個位置,不用擴容
  4. 第 11 次添加元素,此時 size+1 = 11,而數組長度是10,這時候建立一個長度爲10+10*0.5 = 15 的數組(擴容1.5倍),而後將原數組元素引用拷貝到新數組。並將第 11 次添加的元素賦值到新數組下標爲10的位置。
  5. 當擴容newCapacity - MAX_ARRAY_SIZE > 0 直接使用hugeCapacity(minCapacity)擴容 (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE
  6. 第 Integer.MAX_VALUE + 1 次添加元素時,拋出 OutOfMemoryError 異常
    • *

源碼以下:數組

private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }

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

    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}
/**
     * 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;
    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);
}
private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
    MAX_ARRAY_SIZE;
}

ArrayList和LinkedLisL區別

  1. 兩個都是基於List的接口,非線程安全
  2. arraylist底層使用的數組,linkedlist底層使用的是鏈表
  3. 數組查詢具備查詢特定元素比較快,而插入或刪除時比較慢(數組在內存中是一塊連續的內存,插入或刪除時會移動內存)
  4. 鏈表不要求連續的內存,當前元素存放上一個或下一個元素的地址,查詢時須要從頭部開始一個一個的找,查詢效率低,插入時不須要移動內存,只需改變引用指向便可,因此插入或刪除效率高
  5. ArrayList使用在查詢多,插入或查詢少的場景
  6. LinkedList使用在插入或刪除多,查詢少的場景中
相關文章
相關標籤/搜索