/**
* ArrayList 是List接口的动态数组实现,实现了List的所有可选操作,并且允许所有元素,包括null。
* ArrayList 跟Vector差不多,但它不是线程安全的。
* ArrayList 的容量会根据列表大小自动调整。在添加大量元素之前,可以使用ensureCapacity 方法来保证列表有足够空间存放元素。
* ArrayList 不是线程安全的,所以如果多条线程将要对其进行结构性改变时(如添加删除元素),需要使用synchronized 进行同步。
* 如果不存在这样的对象,则需要使用其同步包装类 Collections.synchronizedList
* List list = Collections.synchronizedList(new ArrayList(...));
*
* iterator() 方法将会返回一个listIterator,其中的方法是“fail-fast(快速失败的)”,如果在创建了迭代器之后,在用迭代器遍历一个列表时,
* 如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。
* 但fail-fast 的行为是无法得到保证的,不可能对是否出现不同步并发修改做出任何硬性保证。
* 快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。
* 因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测 bug。
*/
public class ArrayList extends AbstractList
implements List,RandomAccess,Cloneable,java.io.Serializable
{
private static final long serialVersionUID = 8683452581122892189L;
* 默认容量
*/
int DEFAULT_CAPACITY = 10
* 空实例共享的空数组
* todo 为什么要区分 EMPTY_ELEMENTDATA 与 DEFAULTCAPACITY_EMPTY_ELEMENTDATA
final Object[] EMPTY_ELEMENTDATA = {};
* 默认大小的空实例共享的空数组
final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA =
* ArrayList的元素存储在其中的数组缓冲区。ArrayList的容量是这个数组缓冲区的长度。
* 当添加第一个元素时,任何为 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的空ArrayList的容量
* 将扩充到默认大小DEFAULT_CAPACITY(10)。
* 设置为非private 是为了方便内部类进行访问
*
* todo 内部动态数组的维护
transient Object[] elementData;
* 列表中实际存储的元素个数
*
* todo size 与 capacity
int size;
* 构造一个指定初始容量的空列表
public ArrayList( initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
* 构造一个默认容量的空列表
public ArrayList() {
DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
* 构造一个包含集合C中所有元素的列表,存储顺序为集合C迭代器遍历的顺序
public ArrayList(Collection |