文章目录
一、示例代码
package com.cyl.collection;
import java.util.ArrayList;
/**
* @Author CYL
* @Date 2022/1/31
*/
@SuppressWarnings({"all"})
public class ArrayListSource {
public static void main(String[] args) {
//无参构造函数
ArrayList list = new ArrayList();
for (int i = 0; i < 10; i++) {
list.add(i);
}
for (int i = 11; i < 15; i++) {
list.add(i);
}
list.add(100);
list.add(200);
list.add(null);
}
}
二、代码分析(无参)
01 调用无参构造函数
//调用无参构造函数
ArrayList list = new ArrayList();
debug模式下发现初始化为空{}
创建了一个空的elementData数组
02 for循环
for (int i = 0; i < 10; i++) {
list.add(i);
}
1.每次将i自动装箱
2.调用add()
(1) ensureCapacityInternal(size+1) 确认容量是否够添加一个数据(确定是否扩容)
(2) 执行赋值
3.ensureCapacityInternal()
确定是否是一个空数组
是空数组(即第一次添加),赋一个最小容量minCapacity 10
4.ensureExplicitCapacity()检查是否要扩容
(1) modCount++ 记录当前集合被修改的次数 (和迭代器有关的)
(2) inCapacity(实际需要的最小容量) - elementData.length(实际要的容量) > 0
(3) 容量不够 则需要扩容 (10 - 0 > 0) 调用grow()真的去扩容
调用grow()真正扩容
(1) newCapacity = oldCapacity + (oldCapacity >> 1)
新的容量=老的 + 老的/2 (即1.5倍)
0 + 0/2 = 0 (无参构造函数初识为0)
(2) if (newCapacity - minCapacity < 0) 第一次没有真正使用1.5倍的扩容机制
0 - 10 < 10 不够 默认为minCapacity=10
(3) if (newCapacity - MAX_ARRAY_SIZE > 0)
防止无限扩容
(4) Arrays.copyOf()
得到10个空的对象的数组
下一次扩容大小为
10 + 10/2 = 15
三、代码分析(有参)
package com.cyl.collection;
import java.util.ArrayList;
/**
* @Author CYL
* @Date 2022/1/31
*/
@SuppressWarnings({"all"})
public class ArrayListSource {
public static void main(String[] args) {
//无参构造函数
//ArrayList list = new ArrayList();
ArrayList list = new ArrayList(8);
for (int i = 0; i < 10; i++) {
list.add(i);
}
for (int i = 11; i < 15; i++) {
list.add(i);
}
list.add(100);
list.add(200);
list.add(null);
}
}
调用有参构造函数
创建了一个指定大小的数组
其他流程一样;