## ArrayList源码分析
一.参数
//默认的数组初始大小为10
private static final int DEFAULT_CAPACITY = 10;
//数组的长度
private int size;
//默认空数组:当调用ArrayList的无参构造方法时,默认给elementData赋值EFAULTCAPACITY_EMPTY_ELEMENTDATA (空数组)
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
注:无参构造器初始化时,默认是空数组,只有在第一次add时才会扩容默认大小10
//ArrayList数组存放数据的容器
transient Object[] elementData;
二.构造方法
ArrayList包含三种构造方法
1).无参构造方法,初始数组为空数组
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
2).有参构造方法
指定集合初始长度
指定初始数据初始化
三.ArrayList常用方法
1.get方法
2.add方法以及扩容
扩容:
计算容量
判断是否进行扩容:当需要的最小容量大于实际存储数据数组的长度时,进行扩容
grow()扩容,根据需求,得出新数组的大小,使用Arrays.copyOf()将原数组的值复制到新数组中
总结:添加的步骤
1).add()方法中首先调用ensureCapacityInternal()方法区进行是否扩容的初判断
2).ensureCapacityInternal()方法中调用calculateCapacity()方法区计算预期容量(所需要的最小容量),即:当集合中还没有存放数据时,选取最小容量与默认初始容量之间最大的数作为最小容量(预期容量),当集合中存放数据时,最小容量不变
3).根据获取的最小容量,调用ensureExplicitCapacity()方法,判断是否进行扩容操作(grow)。当最小容量大于原来集合中数组的长度,进行扩容
4)扩容(grow方法),新数组的容量为原数组的1.5倍,如果此时新数组的容量仍然小于最小容量,那么最小容量的赋值给新数组,
5)。判断新数组的容量是否超过最大数组的值,超过判断最小容量是否小于0(即超出int类型的最大值)抛出内存溢出错误,否则,判断最小容量是否超过数组最大值,超过将Integer.MAX_VALUE作为新数组的容量,没有超过数组最大值新数组容量为数组最大值
6).将原数组赋值到新数组中,扩容完成
注:ArrayList整个add过程没有对线程安全进行限制,因此线程不安全
可以通过synchronizeList保证线程安全
ArrayList扩容量原来的0.5倍 即原来是10 扩容后15
3.remove()移除
按照索引删除 remove(int index)
按值进行删除 remove(Object o)
4.clear()方法 清空
5.set方法