package Gather.List;
import java.util.ArrayList;
/**
* @author 小王宝友
* @version 3.89
* ArrayList的底层操作机制:
* 1、ArrayList中的数据都会存放到一个Object类型的elementDate的数组里
* transient Object[] elementData transient是瞬间的,组成数组时不会被序列化
* 2、当创建ArrayList对象时,如果使用的是无参构造器,则初始的elementData容量为0
* 第一次添加会扩容到10,若需要再次扩容,则扩容到elementData的1.5倍
* 3、如果使用的是指定大小的构造器,则初始elementData容量为指定大小
* ,若需要扩容,则直接扩容为elementData的1.5倍
* 4、第一次扩容为newCapacity = 10,第二次及其以后为原来数组的1.5倍来扩容
* 5、扩容使用的是Array.copyOf()是为了保证数组原来的数据不被删除
*/
@SuppressWarnings({"all"})
public class ArrayListSource {
public static void main(String[] args) {
//使用无参构造器创建ArrayList对象
//相当于创建了一个空的elementData数组
ArrayList<Object> arrayList = new ArrayList<>();
//创建一个指定大小为8的ArrayList对象
//ArrayList<Object> arrayList = new ArrayList<>(8);
//使用for循环给arrayList集合添加1-10的数据
//增加数组时,调用arrayList.add方法时会先使用ensureCapacityInternal();的方法确容器是否够数据存储
//再将数据放入到elementData的数组中
//1、先确定是否需要扩容
//2、然后再执行arrayList.add方法,赋值
for (int i = 0; i <= 10; i++) {
arrayList.add(i);
}
使用for循环给arrayList集合添加11-15的数据
for (int i = 11; i <= 15; i++) {
arrayList.add(i);
}
arrayList.add(100);
arrayList.add(200);
arrayList.add(null);
}
}
当第一个for循环完成时elementData数组有10个空间,size表示数组大小,modCount为数组改变的次数。
当第二次for循环完成时 共有15个空间
再往下添加时,数组会扩容到22个空间