乾了這杯Java之ArrayList

List存儲一個有序元素合集java

List接口的實現類有: ArrayList,LinkedList,Vector,Stack數組

ArrayList一個數組型的Listthis

默認容量爲10code

private static final int DEFAULT_CAPACITY = 10;

擴容對象

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);
}
  • 擴容的大小爲原長度+1/2的原長度
  • 若是擴容長度比傳入的最小容量小,則使用最小容量,若是擴容長度超過設定的最大容量,則實用最大正整數
  • 初始化默認長度爲10,當添加到11個長度時,容量爲15

add方法繼承

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}
  • ensureCapacityInternal(size + 1);確保內部容量,不夠則擴容
  • elementData[size++] = e;賦值

remove方法索引

public E remove(int index) {
    //檢查下標
    rangeCheck(index);

    modCount++;
    E oldValue = elementData(index);
    //移動元素
    int numMoved = size - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
                         numMoved);
    elementData[--size] = null; // clear to let GC do its work

    return oldValue;
}

subList內部類接口

生成subList對象ci

public List<E> subList(int fromIndex, int toIndex) {
    //檢查邊界
    subListRangeCheck(fromIndex, toIndex, size);
    //生成的時SubList對象,注意this
    return new SubList(this, 0, fromIndex, toIndex);
}

subList繼承自AbstractListelement

private final AbstractList<E> parent;
private final int parentOffset;
private final int offset;
int size;

SubList(AbstractList<E> parent,
    int offset, int fromIndex, int toIndex) {
    this.parent = parent;
    this.parentOffset = fromIndex;
    this.offset = offset + fromIndex;
    this.size = toIndex - fromIndex;
    this.modCount = ArrayList.this.modCount;
}
  • 在構造方法中this.parent = parent,意味着對象爲原始list
  • this.parentOffset = fromIndex;和this.offset = offset + fromIndex;爲原始索引
public void add(int index, E e) {
    rangeCheckForAdd(index);
    checkForComodification();
    parent.add(parentOffset + index, e);
    this.modCount = parent.modCount;
    this.size++;
}
  • parent.add(parentOffset + index, e);原始list將被添加一個元素
  • remove方法中E result = parent.remove(parentOffset + index);將在原始list中移除

結論:

  • 在操做sublist的添加、移除等方法的時候,原始list將會被修改
  • sublist是一個list的視圖
相關文章
相關標籤/搜索