学习和工作中经常会使用List来存储数据,那么今天就来解析List的一个基于实现ArrayList类源码,不再废话,开始学习:
源码解析:
ArrayList创建的几种方式:
new ArrayList<>();// 无参方式
DEFAULTCAPACITY_EMPTY_ELEMENTDATA: 用于默认大小的空实例的共享空数组实例。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
elementData: ArrayList的内部用来存储数据的数组。
new ArrayList<>(5);// 指定参数方式
ArrayList中的方法解析:
add(): 添加元素
add: 将指定的元素(E e)追加到列表(内部数组)的末尾。
ensureCapacityInternal( size + 1 ) : 是否增加数组长度
calculateCapacity( elementData, minCapacity): 返回要增加的数组长度
elementData: 内部数组对象,minCapacity:指定的数组长度。
2个分支:
分支一: elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
如果内部数组对象 == {} 空对象 进行一个Math.max比较大小赋值, Math.max(DEFAULT_CAPACITY, minCapacity) minCapacity初始值为1,DEFAULT_CAPACITY默认值为10
所以该方法第一次会默认返回10个大小;
分支一:
如果elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA
只有第一次add的时候elementData才是{} 空对象,第二次之后数组就有了长度
所以从第二次add开始 再进入calculateCapacity方法只会进入分支二运行
从第二次add开始之后再进入calculateCapacity方法会返回指定的数组长度minCapacity
待续~