ArrayList 源码解析和设计思路
整体架构:
ArrayList 整体架构比较简单,就是一个数组结构,比较简单,如下图
图中展示是长度为 10 的数组,从 1 开始计数,index 表示数组的下标,从 0 开始计数, elementData 表示数组本身,源码中除了这两个概念,还有以下三个基本概念:
1、DEFAULT_CAPACITY 表示数组的初始大小,默认是 10,这个数字要记住;
2、size 表示当前数组的大小,类型 int,没有使用 volatile 修饰,非线程安全的;
3、modCount 统计当前数组被修改的版本次数,数组结构有变动,就会 +1。
源码解析
1、初始化
有三种初始化办法:源码如下:
无参数直接初始化
指定初始数据初始化
指定大小初始化
总计:ArrayList 无参构造器初始化时,默认大小是空数组,并不是大家常说的 10,10 是在第一次add 的时候扩容的数组值
2.2 新增和扩容实现
新增就是往数组中添加元素,主要分成两步:
1、判断是否需要扩容,如果需要执行扩容操作;
2、直接赋值。
两步源码体现如下:
总结:
1、扩容的规则并不是翻倍,是原来容量大小 + 容量大小的一半,直白来说,扩容后的大小是原来容量的 1.5 倍
2、ArrayList 中的数组的最大值是 Integer.MAX_VALUE,超过这个值,JVM 就不会给数组分配内存空间了
3、新增时,并没有对值进行严格的校验,所以 ArrayList 是允许 null 值的。

浙公网安备 33010602011771号