📚 分类
集合
🕵🏽‍♀️ 问题描述
ArrayList源码分析
👨‍🏫 问题讲解
ArrayList源码分析-成员变量

// 默认初始的容量(CAPACITY)
private static final int DEFAULT CAPACITY= 10;

// 用于空实例的共享空数组实例
private static final Object] EMPTY ELEMENTDATA = {};

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

/**存储 ArrayList 元素的数组缓冲区。ArrayList 的容量就是这个数组缓冲区的长度。
  *当添加第一个元素时,任何具有 elemenData == DEFAULTCAPACITY EMPTY_ELEMENTDATA 的空 ArrayList
  *都将护展为 DEFAULT CAPACITY*当前对象不参与序列化
  */
transient Object[] elementData; 

// ArrayList 的大小(它包含的元素数量)
private int size;

❒ 数组初始化方法有三个

✔ 第一:指定数组长度
✔ 第二:无参构造函数
✔ 第三:参数是一个线性集合

❒ 数组的新增过程

✔ 一般我们使用的都是无参构造函数去创建数组
✔ 每次新增的时候会先判断当前size+1和当前elementData长度哪个大,默认 size + 1 (0 + 1) > elementData.length(0)
✔ 所以第一次添加数据,数组便会扩容一次,长度为  DEFAULT CAPACITY = 10
✔ 当添加数据大于10的时候,便会再次触发扩容,扩容公式为 elementData.length + length >> 1 (扩容0.5倍,加上原来大小是1.5倍)
✔ 扩容时,需要对数组进行拷贝 elementData = Arrays.copyOf(elementData, newCapacity);
🏳️‍🌈 问题总结
❒ ArrayList底层的实现原理是什么

✔ ArrayList底层是用动态的数组实现的
✔ ArrayList初始容量为0,当第一次添加数据的时候才会初始化容量为10,ArrayList在进行扩容的时候是原来容量的1.5倍,每次扩容都需要拷贝

❒ 数组ArrayList在添加数据的时候

✔ 确保数组已使用长度(size)加1之后足够存下下一个数据
✔ 计算数组的容量,如果当前数组已使用长度+1后的大于当前的数组长度,则调用grow方法扩容(原来的1.5倍)
✔ 确保新增的数据有地方存储之后,则将新元素添加到位于size的位置上。
✔ 返回添加成功布尔值。
📖 问题信息
📈 浏览次数:16 | 📅 更新时间:2025-12-03 10:19:10
📦 创建信息
🏷️ ID:80 | 📅 创建时间:2025-01-06 12:04:46