ArrayList底层源码

ArrayList底层结构是Object类型的数组
属性:
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
transient Object[] elementData;
private int size;
构造器:
ArrayList底层源码
ArrayList底层源码JDK1.7:创建对象默认长度为10(饿汉模式)
JDK1.8: 在创建对象时,如果不初始化长度默认容量为0,只有在调用add(),才创建一个长度为10的数组(具体下面源码有解释),这样做主要是为了节约空间(懒汉模式)
调用add()方法源码:
ArrayList底层源码ArrayList底层源码ArrayList底层源码ArrayList底层源码这里仔细说明:当第一次添加元素时,调用add(),接着会调用grow()来确定一个长度为10的数组,第二次第三次添加元素都不会调用grow方法,直到添加第11个元素时,才会再一次调用grow方法来进行第一次进行扩容。扩容机制为增加原来的一半。
向数组中添加第10个元素时,数组容量仍为10;
向数组中添加第11个元素时,数组扩容为15;
向数组中添加第16个元素时,数组扩容为22。
扩容调用的是Arrays.copyOf(),创建一个新的数组,将原数组内容拷贝到新数组中。
总结:每次在add()元素时,arraylist都需要对这个list的容量进行判断,如果容量够,直接添加,否则需要进行扩容,扩容调用的是grow()方法中调用的Arrays.copyOf()方法进行对原数组的复制,在通过 System.arraycopy()方法进行复制,到达扩容的目的。