(一)ArrayList集合源码解析
一、ArrayList的集合特点
问题 | 结 论 |
ArrayList是否允许空 | 允许 |
ArrayList是否允许重复数据 | 允许 |
ArrayList是否有序 | 有序 |
ArrayList是否线程安全 | 非线程安全 |
二、ArrayList的原理
ArrayList底层是一个Object[] elementData数组,能够实现动态扩容,增减。
从源码看ArrayList实现了RandomAccess, Cloneable,Serializable接口,RandomAccess用于快速存取提高循环的效率。Cloneable该接口可以实现对象的克隆方法。Serializable可以进行序列化,序列化是将对象的状态信息转换为可以存储或传输的形式的过程。
三、源码解析
1.属性和构造方法
源码解析主要是从集合从增加元素,删除元素,查询元素,以及修改元素这几个常用方法进行解析。
- ArrayList属性
1 transient Object[] elementData;//定义一个elementData数组2 private int size;//size是数组大小实现数组增减size进行增减
- ArrayList无参构造方法
1 /**2 * Constructs an empty list with an initial capacity of ten. 3 */4 public ArrayList() { 5 this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;//将elementData进行初始化elementData也是个Object[]类型。空的Object[]会给默认大小106 } 7 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
- ArrayList有参构造方法
1 public ArrayList(int initialCapacity) { 2 if (initialCapacity > 0) { 3 this.elementData = new Object[initialCapacity];//将自定义的容量大小当成初始化elementData的大小 4 } else if (initialCapacity == 0) { 5 this.elementData = EMPTY_ELEMENTDATA;//为0直接进行初始化 6 } else { 7 throw new IllegalArgumentException("Illegal Capacity: "+ 8 initialCapacity);//判断如果自定义大小的容量小于0,则报下面这个非法数据异常 9 } 10 }
- ArrayList(Collection<? extends E> c)构造方法