ArrayList继承AbstractList抽象类,根据源码可以知道,内部是一个对象数组,源码如下:
private static final int DEFAULT_CAPACITY = 10;//默认容量为10
/**
*三个对象数组是ArraList根据调用的构造器不同,初始化选择
*/
private static final Object[] EMPTY_ELEMENTDATA = {};//初始化长度为0的对象数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
transient Object[] elementData; // non-private to simplify nested class access
private int size;//ArrayList的大小
定义ArrayList调用不同的构造器时:
1.设置一定大小的构造器:
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];//当initialCapacity>0,初始化一个存储集合的缓存区
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;//调用默认为0的数组对象
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
2.空构造器时
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
3.集合参数的构造器
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();//将集合转换为数组格式
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
添加一个数据时:
/**
*在集合末尾添加一个数据
*/
public boolean add(E e) {
ensureCapacityInternal(size + 1); // 目的就是增加对象数组容量,防止数组越界
elementData[size++] = e;
return true;
}
/**
* 在指定索引下添加数据
*/
public void add(int index, E element) {
if (index > size || index < 0)//添加元素超过集合大小或者小于0时,抛出异常
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
ensureCapacityInternal(size + 1); // 增加对象数组容量,防止数组越界
System.arraycopy(elementData, index, elementData, index + 1,
size - index);//将对象数组elementData从index位置开始复制,放到elementData的index + 1位置,即index位置的元素整体后移了以为,这就是ArrayList在插入元素变慢的原因。
elementData[index] = element;//将元素添加到index
size++;//集合的大小+1
}
同理,在移除某个元素时,之后的元素都向前移动一位。