import java.util.ArrayList;
import java.util.List;
/**
* 由于ArrayList的底层数据结构是Object数组,所以我们用无参构造方法创建ArrayList时,
* 它初始化赋值的是一个空数组,当我们对其进行添加第一个元素时,数组的容量会扩容为10,
* 当我们添加的元素个数>10时,我们就需要进行扩容,扩容后的ArrayList容量则会变为原本容量的1.5倍左右
*/
public class ArrayListSource {
public static void main(String[] args) {
//第一种方法
//创建一个ArrayList数组
List<Integer> list = new ArrayList<>();
//进行扩容操作演示
for (int i = 1; i <= 20; i++) {
if (i==1){
System.out.println("还未添加元素,容量为0");
}
list.add(i);
if (i==1){
System.out.println("第一次添加元素,初始容量为10");
}
if (i==11){
System.out.println("第一次进行扩容,容量为10*1.5=15");
}
if (i == 16) {
System.out.println("第二次进行扩容,容量为15*1.5=22.5 -> 22");
}
}
//第二种方法,手动设置一个初始容量
List<Integer> list1 = new ArrayList<>(4);
for (int i = 1; i <= 20; i++) {
if (i==1){
System.out.println("还未添加元素,容量为0");
}
list1.add(i);
if (i==1){
System.out.println("第一次添加元素,初始容量为4");
}
if (i==5){
System.out.println("第一次进行扩容,容量为4*1.5=6");
}
if (i == 7) {
System.out.println("第二次进行扩容,容量为6*1.5=9");
}
}
}
}
首先对其进行断点(DeBug)
到达第一个断点时(此时容量为0),DeBug结果为
到达第二个断点时(此时容量为10,默认初始容量),DeBug结果为
到达第三个断点时(此时容量为15),DeBug结果为
到达第三个断点时(此时容量为22),DeBug结果为
总结:
在JDK1.8中,如果通过无参构造的话,初始数组容量为0,当真正对数组进行添加时(即添加第一个元素时),才真正分配容量,默认分配容量为10;当容量不足时(容量为size,添加第size+1个元素时),先判断按照1.5倍(位运算)的比例扩容能否满足最低容量要求,若能,则以1.5倍扩容,否则以最低容量要求进行扩容。执行add(E e)方法时,先判断ArrayList当前容量是否满足size+1的容量;在判断是否满足size+1的容量时,先判断ArrayList是否为空,若为空,则先初始化ArrayList初始容量为10,再判断初始容量是否满足最低容量要求;若不为空,则直接判断当前容量是否满足最低容量要求;若满足最低容量要求,则直接添加;若不满足,则先扩容,再添加