ArrayList个人心得

字段:

 size并不代表elementData的长度,代表ArrayList的元素数量

构造:

 从无参构造可以看出ArrayList底层走的数组原理,ArrayList的操作都是由elementData来记录

Add操作:

 从add方法看出,elementData[size++]才是真正的新增操作,

ensureCapacityInternal(size + 1)实际是为了给elementData数组扩容操作

扩容原理:

 

 扩容之前为了计算出ArrayList的容量

minCapacity代表ArrayList之前的size+1,如果该次新增操作超过了默认值10,取出最大值

 modCount记录ArrayList操作次数;

当minCapacity(size+1)大于elementData(默认长度10)数组大小,elementData才会实现扩容操作

 第一次新增minCapacity为10,需要将elementData扩容为长度为10,所以说elementData默认长度为10的数组

然而当新增到11个元素的时候实现扩容操作

newCapacity扩容为15,对半扩容

int newCapacity = oldCapacity + (oldCapacity >> 1);

以下是ArrayList新增流程图:

Remove操作

 1.rangeCheck校验传入的index是否超出arrayList最大下标

2.arrayList修改次数modCount++

3.取出该次需要删除的元素

4.获取需要移动的个数

5.sysyem.arraycopy数组复制

6.通知jvm将之前的最后一位元素进行垃圾回收

参数解释:

src:源数组

srcPos:源数组复制的起始值

dest:目标数组

destPos:目标数组放值的起始位置

length:源数组需要复制的数量以及目标数组需要放值的数量

addAll操作:

 1.将需要新增的集合转为数组

2.ensureCapacityInternal(size + numNew)判断是否需要为elementData扩容操作,扩容流程见上上上上图

3.sysyem.arraycopy方法将新的数组复制到elementData,解释见上图

4.ArrayList元素数量新增

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值