部分重要属性
//存放元素的数组
transient Object[] elementData;
//大小,非elementData的length,存入元素的总个数
private int size;
add方法
public boolean add(E e) {
//保证数组不溢出,否则进行扩容操作
ensureCapacityInternal(size + 1);
elementData[size++] = e;
//返回值都为true
return true;
}
扩容grow方法
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
//扩容大小为之前的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//新的容量大小不能超过Integer.MAX_VALUE - 8
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
//元素复制,主要采用System.arraycopy方法
elementData = Arrays.copyOf(elementData, newCapacity);
}
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;
return oldValue;
}
iterator()方法
public Iterator<E> iterator() {
//访问指针的封装对象
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor; // 移动指针
int lastRet = -1; // 上一个指针
int expectedModCount = modCount;
}
总结
- ArrayList采用Object数组存储元素;
- ArrayList默认容量大小为10,Object数组采用延迟初始化的方式;
- ArrayList扩容新容量为原容量的1.5倍;
- iterator原理类似指针,通过cursor值来访问修改数组元素;