先说明ArrayList的底层结构和操作分析
1、ArrayList的底层结构是一个Object[] elementData,即一个Object类型的数组。
2、创建ArrayList对象时,如果采用的是无参构造器,则数组初始空间为0,第一次添加数组空间扩容至10,如需再次扩容,则扩容至原数组空间的1.5倍。
3、如果采用的是有参构造器,则数组初始空间为传入的参数值,如需再次扩容,则扩容至原数组空间的1.5倍。
4、添加元素的顺序与取出元素的顺序相同。
5、每个元素都有对应的索引,即可以通过索引查找元素。
6、ArrayList可以添加多个null,也可以添加相同元素。
ArrayList 底层源码分析
证明ArrayList的底层结构是一个Object类型的数组
1、Debug进入ArrayList arrayList = new ArrayList(),分析ArrayList的底层结构
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
2、再进入elementData,我们可以看见ArrayList的底层结构是一个Object[] elementData,即一个Object类型的数组。
transient Object[] elementData;
3、因为采用的是无参构造器,所以数组初始空间为0,为了证实我们进入DEFAULTCAPACITY_EMPTY_ELEMENTDATA。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
};
4、如果采用的是有参构造器,例如:ArrayList arrayList1 = new ArrayList(8);,Debug进入
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
此时initialCapacity = 8,满足第一个if条件