【透过现象看本质】创建ArrayList

现象:

        List<Integer> strs = new ArrayList<>(); // a
        for (int i = 1; i <= 11; i++) {
            strs.add(i); //b
        }

本质:

A. 执行a 创建一个ArrayList 会有两个数组
存储ArrayList的元素的数组缓冲区。
ArrayList的容量是此数组缓冲区的长度。添加第一个元素时,任何具有elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA 空ArrayList都将扩展为DEFAULT_CAPACITY。

transient Object[] elementData;//非私有以简化嵌套类访问

共享的空数组实例,用于默认大小的空实例。我们将其与EMPTY_ELEMENTDATA区别开来,以了解添加第一个元素时需要充气多少。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

//构造函数
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

注意:此时没有声明长度 只是创建一个空的Object类型的数组

B.执行b .add() 方法
ArrayList extend AbstractList

private int size;//计算长度变量 初始成员变量
private static final int DEFAULT_CAPACITY = 10;//私有常量
protected transient int modCount = 0;//修改次数(父类的受保护变量)

里面有个私有方法 (确保内部容量方法)
ensureCapacityInternal(size + 1); // Increments modCount!!
这个方法含义 (确保该容量参数不会溢出)
1.判断这个 size = size > DEFAULT_CAPACITY ?size : DEFAULT_CAPACITY
2.grow(size) //增加容量以确保它至少可以容纳 最小容量参数指定的元素数。
会有两个容量 int oldCapacity int newCapacity 进行分析后
并且最后 elementData = Arrays.copyOf(elementData, newCapacity);

C.往数组中添加数据
elementData[size++] = E;

来自博主的总结:

1.先创建一个空Object[]
2.插入时候先判断这个数组大小 当最小容量大于 elementData.length
会执行 grow(minCapacity)//以确保它能够至少容纳最小容量参数指定的元素的数目的容量。 minCapacity(最小容量)
3.记录修改次数 modCount++;
4.往定好长度的 Object[minCapacity] 塞本次添加的数据

发表评论

电子邮件地址不会被公开。 必填项已用*标注