源码分析-ArrayList
1、内部属性
DEFAULT_CAPACITY : 默认初始容量 为10
EMPTY_ELEMENTDATA : 空对象数组
DEFAULTCAPACITY_EMPTY_ELEMENTDATA : 默认填充的数组,和上方 EMPTY_ELEMENTDATA 在用途上没有差异
elementData : 存放数据的对象数组,调用构造器时才初始化
size : 数组大小
MAX_ARRAY_SIZE : 数组最大容量 Integer.MAX_VALUE - 8
2、主要方法
ArrayList() 构造方法-初始化 elementData 对象数组,如果是指定长度的构造方法会进行数值判断后,创建指定长度的数组,如果是传入集合的构造方法,需要对传入的集合进行判空操作后,在将数组进行赋值



add(T t) 调用此方法时 会先调用 ensureCapacityInternal(int minCapacity)方法,并将list当前的size+1后传入该方法中,该方法中又会去调用 calculateCapacity(Object[] elementData, int minCapacity)和 ensureExplicitCapacity(int minCapacity)方法进行下一步验证,
在调用calculateCapacity方法时会将当前存储的数据数组和上游传下来的 minCapacity 作为参数传入到calculateCapacity方法中


calculateCapacity 方法在拿到参数后会将elementData于DEFAULTCAPACITY_EMPTY_ELEMENTDATA 进行比较 如果相等就返回 DEFAULT_CAPACITY 和 minCapacity 中最大的一个,否则直接返回 minCapacity
ensureExplicitCapacity 方法在接收到calculateCapacity方法的返回值后,将得到的参数与数组长度进行相减,如果大于0 就跳过,小于0 就将得到的参数传入grow(int minCapacity)方法中,进行数组长度扩容

grow 方法会先将原来数组长度进行初次扩容(加上原来数组长度的一半),然后入接受到的参数minCapacity进行比较返回最大值,然后再于MAX_ARRAY_SIZE 进行比较,如果minCapacity小于0 就抛出异常,反之返回Integer.MAX_VALUE,最终将原来的数组通过Arrays.copyOf()进行复制


浙公网安备 33010602011771号