首页投稿(暂停使用,暂停投稿)技术文程序员

ArrayList解析

2016-07-29  本文已影响362人  风风风筝

基于JDK1.8
只列出关键方法,主要关注默认情况、初始化、扩容、add、remove。

private static final int DEFAULT_CAPACITY = 10;
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
public ArrayList() { //默认是个空数组,也有重载方法可以设置初始数组大小
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public boolean add(E e) {
    ensureCapacityInternal(size + 1); //关注这个方法
    elementData[size++] = e;
    return true;
}
private void ensureCapacityInternal(int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); //默认就是10
    }
    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)
        newCapacity = hugeCapacity(minCapacity);
    elementData = Arrays.copyOf(elementData, newCapacity);
}

get(int index)比较简单,直接返回elementData[index]。
ArrayList比较简单,默认情况下是空数据,第一次add默认初始化长度10,每次按1.5倍扩容。再看下remove

public E remove(int index) {
    rangeCheck(index);
    modCount++;
    E oldValue = elementData(index);
    int numMoved = size - index - 1; //判断是不是最后一项,如果不是最后一项,就把该index后面的数据项都赋值给前一位,然后再把最后一项设为null
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
                         numMoved);
    elementData[--size] = null; //这行代码值得很多人学习,数组集合里没用的项要及时释放
    return oldValue;
}

附图


上一篇下一篇

猜你喜欢

热点阅读