ArrayList底层结构和源码分析、扩容机制

ArrayList是一个基于数组的列表,其elementData数组用于存储元素。默认初始容量为0或指定大小,首次添加或超出容量时会按1.5倍扩容。扩容过程涉及创建新数组并使用Arrays.copyOf()迁移数据。由于非线程安全,不适合多线程环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ArrayList中维护了一个Object类型的数组elementData。    

transient Object[] elementData;   // transient 表示瞬间,短暂的,表示该属性不会被序列化

ArrayList是线程不安全的

ArrayList的扩容机制

  1. 当创建ArrayList对象时,如果使用的是无参构造器,则初始elementData容量为0。第一次添加,则扩容elementData为10,如需要再次扩容,则扩容elementData为1.5倍。
  2. 如果使用的是指定大小的构造器,则初始elementData容量大小指定大小,如果需要扩容,则直接扩容elementData为1.5倍。

ArrayList是一个数组结构的存储容器,默认情况下,数组的长度是10。当然,我们也可以在构建ArrayList对象的时候,直接指定初始长度。那么,随着程序的运行,不断地往ArrayList中添加数据,当添加的数据达到10个的时候,ArrayList就没有足够的容量来存储后面添加的数据。那么,这个时候,ArrayList会触发自动扩容机制。

扩容的流程其实也很简单,首先创建一个新的数组,这个数组的长度是原来数组长度的1.5倍。然后,使用Arrays.copyOf()方法把原数组中的数据拷贝到新数组中。扩容完成之后,再把当前要添加的数据加入到新的数组中,从而完成动态扩容的过程

创建了一个空的elementData数组={};
先确定是否要扩容,然后再执行赋值。

确定最小数组长度minCapacity;注意:如果使用无参构造器,则执行if语句,第一次扩容为10
modCount++ 记录集合被修改次数,如果elementData的大小不够就调用grow()方法去扩容
扩容方法
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值