1. ArrayList声明
ArrayList 集成了AbstractList,实现了List接口,RandomAccess随机访问,Cloneable可以克隆的,Serializable可序列化
实现了随机访问接口的容器用fori循环遍历最快,没有实现的容器,用迭代器遍历最快
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
2. ArrayList静态属性
/**
* 默认容量
*/
private static final int DEFAULT_CAPACITY = 10;
/**
* 空元素数组
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
* 数据存放数据结构,是一个Object数组实现
*/
transient Object[] elementData; // non-private to simplify nested class access
/**
* 容器使用的大小
*/
private int size;
/** The maximum size of array to allocate.
* Some VMs reserve some header words in an array.
* Attempts to allocate larger arrays may result in
* OutOfMemoryError: Requested array size exceeds VM limit
* 数组最大容量大小
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
3. ArrayList 扩容
3.1 添加元素
先把++size判断一下,长度是否大于当前数组长度,如果大于就扩容,每次扩容int newCapacity = oldCapacity + (oldCapacity >> 1);
即新的容量是旧的容量的1.5倍。
3.2 查找index
用的fori循环查找
3.3 移除元素
移除元素的时候会把移除元素位置的那个索引以后的元素都往前移动一个位置,移动完成之后再把末尾的位置设置为空,这样是为了,数组不被使用的时候也可以被GC回收。
4. 注意
ArrayList与LinkedList相比。其优点是随机读取快,缺点是插入元素时需要移动大量元素,效率不太高。