ArrayList源码解析

2019-05-31  本文已影响0人  IT_lz

1、构造方法初始化

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);
    }
}

2、Add方法

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

​ 第二个变量为新数组的长度,如果新数组长度超过老数组长度,则多出来的元素为默认值。

3、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;
}
  1. 获取当前要返回的值,用于返回。
  2. 将移除的目标元素后面的元素向前平移对齐。
  3. 将最后一个元素置null。在GC时回收掉。

4、get()获取某个位置的值

public E get(int index) {
    rangeCheck(index);

    return elementData(index);
}
  1. 检查index是否越界,越界则报"IndexOutOfBoundsException"。
  2. 返回数据结果。
上一篇 下一篇

猜你喜欢

热点阅读