ArrayList源码分析
简介
ArrayList底层是数组实现的,可以自增扩容的数组,此外它是非线程安全的,一般多用于单线程环境下(Vector是线程安全的,所以ArrayList 性能相对Vector 会好些)
ArrayList继承了AbstractList,实现了List接口
1. 实现了Serializable接口,因此它支持序列化,能够通过序列化传输(实际上java类库中的大部分类都是实现了这个接口的)
2. 实现了RandomAccess接口,支持快速随机访问(只是个标注接口,没有实际的方法),这里主要表现为可以通过数组下标直接访问
3. 实现了Cloneable接口,能被克隆
初始化
transient Object[] elementData; //存储数组元素的缓冲区
private static final Object[] EMPTY_ELEMENTDATA = {}; //空数组元素
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; //默认空数组元素
private static final int DEFAULT_CAPACITY = 10; //默认初始化容量
private int size; //数组的大小
protected transient int modCount = 0; //记录被修改的次数
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//数组的最大值
构造方法
1. public ArrayList()
2. public ArrayList(Collection<? extends E> c)
3. public ArrayList(int initialCapacity);
无参的构造方法
带参数的构造方法1
带参数的构造方法2
从源码里可以看出:首先对传进来的初始化参数initialCapacity进行判断:
如果initialCapacity参数大于0,elementData初始化为一个容量为initialCapacity的数组;如果参数等于0,则将elementData指向了EMPTY_ELEMENTDATA
方法介绍
add方法
总结
ArrayList 内部实现为一个对象数组存放具体的值,用一种扩容的机制,进行数组的动态增长扩容机制。元素的个数大于其容量,则把其容量扩展为原来容量的1.5倍