ArrayList源码
add源码机制
1,创建一个测试类
创建一个无参构造器的ArrayList,for循环10次向集合中添加数据
2,第一次添加数据,先将基本数据类型转换对应的包装类型,进入add方法
modCount记录执行add方法的次数;e表示要添加的元素;elementData表示对象数组,size表示数组的大小;
3,进入add方法
先判断elelmentData和size是否相等,相等,执行grow方法
- minCapacity为最小容量,大小为size加1;oldCapacity为实际容量,大小为elementData的大小
- 在grow方法中,判断实际数组的容量是否大于0或者是否不为null,显然第一次是不满足,执行else方法
- 初始化elementData,大小为DEFAULT_CAPACITY(默认初始容量为10)和minCapacity的最大值,显然第一次初始化大小为10
- 返回add方法,将第一个元素添加到数组的索引为0的位置,数组的大小加一,第一次add结束
- 由于elementData在第一次add时就初始化为10,所以在执行下面的9次add元素都不会执行grow方法,就是依此添加元素到数组
4,在上面的基础上我们在添加一次循环,观察第二次数组扩容的机制
添加数组10次后,数组的参数情况
执行grow方法
1,更新minCapacity为11,oldCapacity为10
2,满足if条件,调用ArraysSupport.newLength方法,返回实际数组长度大小+增长量 给newCapaticy
增长量:在满足最小增长量(minCapacity-oldCapaticy)的情况下,使用推荐增长量(oldCapaticy / 2)
因此,数组的第二次扩容就是按照原来的1.5倍扩容
3,通过数组扩容将扩充elementData的大小为newCapaticy
4,返回add方法,将元素添加到数组中数组的大小加一