一.ArrayList的基本概念
ArrayList是一个数组队列,也就是动态数组,其容量能自动生长,它继承于AbstractList,实现了List, RandomAccess,Cloneable,java.io.Serializable这些接口。
实现了List接口,因此可以使用增加、删除修改、遍历等方法;实现了Serializable接口,因此它支持序列化,能够通过序列化传输;实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问,实现了Cloneable接口,能被克隆,得到副本数据。
每个ArrayList实例都有一个容量,该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造ArrayList时指定其容量。在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量。
ArrayList不是线程安全的,通常用在单线程环境下,在多线程环境下,可以考虑使用Collections.synchronizedList(List l)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类,而且ArrayList中允许元素为null。
ArrayList的数据结构
/** * The array buffer into which the elements of the ArrayList are stored. *
The capacity of the ArrayList is the length of this array buffer. */
private transient Object[] elementData;
/
*
*
* The size of the ArrayList (the number of elements it contains).
*
* @serial
*/
private int size;
ArrayList包含了两个重要的对象:elementData 和 size。
elementData 是”Object[]类型的数组”,它保存了添加到ArrayList中的元素。实际上,elementData是个动态数组,我们能通过构造函数 ArrayList(intinitialCapacity)来执行它的初始容量为initialCapacity;如果通过不含参数的构造函数ArrayList()来创建ArrayList,则elementData的容量默认是10。elementData数组的大小会根据ArrayList容量的增长而动态的增长,具体的增长方式,请参考源码分析中的ensureCapacity()函数。
size 则是动态数组的实际大小。
有个关键字需要解释:transient。
transient中文意思为短暂的吗,转瞬的。
Java的serializable提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用Serializable序列化机制来保存它。为了在一个特定对象的一个域上关闭Serializable,可以在这个域前加上关键字transient。