集合ArrayList底层代码复习

集合ArrayList底层代码学习

ArrayList
底层代码:
底层定义了一个elementData数组来存数据,返回值为Object的数组

当我们new 一个无参的ArrayList时,集合容量是 0,当向集合中第一次添加数据时,会自动扩容到容量为10,当向集合中添加数据容量不够(下面会讲怎样扩容)时,会扩容为原来的1.5倍 也就是 15 然后是 15*1.5 。。。(15 + 15 >> 1   =>  15 + 15/2 =22)
ArrayList<Object> objects = new ArrayList<>();
当我们new 一个有参的ArrayList构造器时 ,集合容量初始化就是定义的容量,第一次扩容是就是定义的容量的1.5倍
ArrayList<Object> arrayList = new ArrayList<>(50);
transient :表示该属性不会被序列化

什么情况下会扩容??怎样扩容?

在这里插入图片描述
集合中add方法中 ensureCapacityInternal(size+1)方法会先判断是否需要扩容,然后再赋值,先看下ensureCapacityInternal(size+1)方法在这里插入图片描述
方法解读:如果这个elementData是个空数组,那么就给他赋最小容量, 最小容量就是Math.max() 方法中间的两个参数比较的最大值,第一次传进来就是10 和 空的比 ,10最大,那么容量就是10

继续进入下面的ensureExplicitCapacity(minCapacity)看下源码

在这里插入图片描述
modCount记录当前集合被修改的次数,在多线程的情况下进行修改的记录
接下来判断如果当前的集合的容量比要添加的集合的容量小,那么就要进行扩容

grow(minCapacity)

在这里插入图片描述
第一次扩容时会进到256行的代码 (0-10<0)会把minCapacity(容量为10)赋值给newCapacity ,新的容量就是10,之后的扩容的话就会按照1.5倍扩容

elementData = Arrays.copyOf(elementData,newCapacity);

为什么用copyOf:
会保留之前的数据,避免数据丢失,再增加一些空间

这样就完成了无参ArrayList的扩容!

注意!!!
Idea 在默认的情况下Debug显示的数据时简化后的,看到完整数据需要做设置,去掉红线的勾选
在这里插入图片描述
debug情况扩容后显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值