ArrayList源码分析
1.实际存储元素的数组为elementData
2.存储集合长度的属性为size
3.有参构造(容量大小)-> 创建Object数组,传入数组长度参数小于0时,抛出异常
4.无参构造-> 初始化elementData为EMPTY_ELEMENTDATA(空数组)
5.有参构造(java集合)-> 将集合转换为数组赋值给elementData,size赋值为数组长度. 如果返回类型不是Object数组,则创建一个新的Object[]对象返回
6.trimToSize -> 操作数+1,删除elementData中的空元素
7.ensureCapacity -> ??
8.size -> return size;
9.isEmpty -> return size == 0;
10.contains -> return indexOf(o) >= 0;
11.indexOf -> 遍历elementData,查询元素下标位置
12.lastIndexOf -> 同上,倒序遍历
13.clone -> 重写克隆方法,通过克隆创建ArrayList对象,然后将自身的elementData及modCount设值为一样
14.toArray -> 将ArrayList里面的元素赋值到一个数组中去 生成Object数组:
15.toArray -> 将ArrayList里面的元素赋值到一个数组中去,专成对应类型的数组
16.get -> 检查传入index是否在size范围内,然后通过elementData(index)获取元素
17.set -> 检查合法,设值elementData(index)
18.add -> 调用ensureCapacityInternal扩容,elementData[size++] = 新元素
19.add(在指定index位置添加元素) -> 检查合法性,调用ensureCapacityInternal扩容,将数组元素后移,index位置赋值
20.ensureCapacityInternal(获得最小扩容)-> 传入的参数与10(默认数组长度)比较,取大值,调用ensureExplicitCapacity判断是否需要扩容
21.ensureExplicitCapacity(判断是否需要扩容)-> 操作数+1,如果传入参数>数组.length,调用grow扩容
22.grow(扩容)-> 将 elementData.length通过位运算扩大0.5,如果长度还不够,则以传入的方式为长度,调用Arrays.copy扩容
23.hugeCapacity(计算ArrayList的最大容量)-> 如果新的长度<0,抛出内存溢出,否则在新长度和arrays_max_size选1
24.remove(index) -> 计算出目标元素的下标,通过System.arraycopy将下标后面的元素置前,然后末尾元素=null,实现删除
25.remove(Object) -> 如果o==null,遍历数组获取null的下标,调用remove(index),否则通过equals对比,相同则调用remove(index)
26.clear -> 数组所有元素置为null,size=0
27.rangeCheck(检测下标是否合法)-> 如果下标>=size,抛出异常
1.实际存储元素的数组为elementData
2.存储集合长度的属性为size
3.有参构造(容量大小)-> 创建Object数组,传入数组长度参数小于0时,抛出异常
4.无参构造-> 初始化elementData为EMPTY_ELEMENTDATA(空数组)
5.有参构造(java集合)-> 将集合转换为数组赋值给elementData,size赋值为数组长度. 如果返回类型不是Object数组,则创建一个新的Object[]对象返回
6.trimToSize -> 操作数+1,删除elementData中的空元素
7.ensureCapacity -> ??
8.size -> return size;
9.isEmpty -> return size == 0;
10.contains -> return indexOf(o) >= 0;
11.indexOf -> 遍历elementData,查询元素下标位置
12.lastIndexOf -> 同上,倒序遍历
13.clone -> 重写克隆方法,通过克隆创建ArrayList对象,然后将自身的elementData及modCount设值为一样
14.toArray -> 将ArrayList里面的元素赋值到一个数组中去 生成Object数组:
15.toArray -> 将ArrayList里面的元素赋值到一个数组中去,专成对应类型的数组
16.get -> 检查传入index是否在size范围内,然后通过elementData(index)获取元素
17.set -> 检查合法,设值elementData(index)
18.add -> 调用ensureCapacityInternal扩容,elementData[size++] = 新元素
19.add(在指定index位置添加元素) -> 检查合法性,调用ensureCapacityInternal扩容,将数组元素后移,index位置赋值
20.ensureCapacityInternal(获得最小扩容)-> 传入的参数与10(默认数组长度)比较,取大值,调用ensureExplicitCapacity判断是否需要扩容
21.ensureExplicitCapacity(判断是否需要扩容)-> 操作数+1,如果传入参数>数组.length,调用grow扩容
22.grow(扩容)-> 将 elementData.length通过位运算扩大0.5,如果长度还不够,则以传入的方式为长度,调用Arrays.copy扩容
23.hugeCapacity(计算ArrayList的最大容量)-> 如果新的长度<0,抛出内存溢出,否则在新长度和arrays_max_size选1
24.remove(index) -> 计算出目标元素的下标,通过System.arraycopy将下标后面的元素置前,然后末尾元素=null,实现删除
25.remove(Object) -> 如果o==null,遍历数组获取null的下标,调用remove(index),否则通过equals对比,相同则调用remove(index)
26.clear -> 数组所有元素置为null,size=0
27.rangeCheck(检测下标是否合法)-> 如果下标>=size,抛出异常