ArrayList实现类(JDK1.7)
//接口=实现类--->为了扩展性这样做--->因为可以Collection col = new LinkedList();
Collection col = new ArrayList();
List list = new ArrayList();
//直接创建实现类对象
ArrayList al = new ArrayList();
/*
ArrayList:
底层的数组elementData--->数组类型:Object类型
size:数组中的有效数据
在JDK1.7中:在调用构造器的时候给底层数组elementData初始化,数组的初始化长度为10
*/
al.add("abc");
al.add("def");
- 内存分析:
- 调用add方法
扩容
- size=10------>ArrayList底层会走grow(minCapacity)方法进行扩容
- 当数组中的10个位置都满了的时候就开始进行数组的扩容,扩容长度为原数组的1.5倍
- grow方法-->创建新数组--->长度为1.5倍
- 将原数组的内容复制到新数组中
- 将elementData指向新数组实现扩容
-
内存分析:
ArrayList(JDK1.8)
-
JDK1.8底层依旧是Object类型的数组,size是有效长度
-
ArrayList al = new ArrayList();---->调用构造器-->初始化为空{}的数组(而不是像1.7长度为10的数组)
-
调用add方法(第一次调用add方法时,底层数组长度才变为10)
-
扩容时候是一样的(size+1=11时---->扩容1.5倍)
总结
- JDK1.7:底层数组,在调用构造器的时候,数组长度初始化为10,扩容的时候扩容为原数组的1.5倍
- JDK1.8:底层数组,在调用构造器的时候,底层数组为{},在调用add方法以后底层数组才重新赋值为新数组,新数组的长度为10---->节省了内存,在add后才创建长度为10的数组