ArrayList源码分析

本文主要介绍Java中ArrayList的构造方法和常用方法。构造方法有三种,包括无参和有参构造。常用方法涵盖get、add、remove、clear、set等,重点讲解了add方法的扩容机制,计算容量、判断扩容,新数组容量为原数组1.5倍,且ArrayList线程不安全。

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

           ## ArrayList源码分析
  一.参数
  //默认的数组初始大小为10
 private static final int DEFAULT_CAPACITY = 10;
 //数组的长度
 private int size;
 //默认空数组:当调用ArrayList的无参构造方法时,默认给elementData赋值EFAULTCAPACITY_EMPTY_ELEMENTDATA (空数组)
 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
 注:无参构造器初始化时,默认是空数组,只有在第一次add时才会扩容默认大小10
 //ArrayList数组存放数据的容器
 transient Object[] elementData; 

二.构造方法
ArrayList包含三种构造方法
1).无参构造方法,初始数组为空数组
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
2).有参构造方法
指定集合初始长度
指定初始数据初始化
在这里插入图片描述
三.ArrayList常用方法
1.get方法
在这里插入图片描述
2.add方法以及扩容
在这里插入图片描述
扩容:
计算容量
在这里插入图片描述
判断是否进行扩容:当需要的最小容量大于实际存储数据数组的长度时,进行扩容
在这里插入图片描述
grow()扩容,根据需求,得出新数组的大小,使用Arrays.copyOf()将原数组的值复制到新数组中
在这里插入图片描述
在这里插入图片描述
总结:添加的步骤
1).add()方法中首先调用ensureCapacityInternal()方法区进行是否扩容的初判断
2).ensureCapacityInternal()方法中调用calculateCapacity()方法区计算预期容量(所需要的最小容量),即:当集合中还没有存放数据时,选取最小容量与默认初始容量之间最大的数作为最小容量(预期容量),当集合中存放数据时,最小容量不变
3).根据获取的最小容量,调用ensureExplicitCapacity()方法,判断是否进行扩容操作(grow)。当最小容量大于原来集合中数组的长度,进行扩容
4)扩容(grow方法),新数组的容量为原数组的1.5倍,如果此时新数组的容量仍然小于最小容量,那么最小容量的赋值给新数组,
5)。判断新数组的容量是否超过最大数组的值,超过判断最小容量是否小于0(即超出int类型的最大值)抛出内存溢出错误,否则,判断最小容量是否超过数组最大值,超过将Integer.MAX_VALUE作为新数组的容量,没有超过数组最大值新数组容量为数组最大值
6).将原数组赋值到新数组中,扩容完成
注:ArrayList整个add过程没有对线程安全进行限制,因此线程不安全
可以通过synchronizeList保证线程安全
ArrayList扩容量原来的0.5倍 即原来是10 扩容后15

3.remove()移除
按照索引删除 remove(int index)
在这里插入图片描述
按值进行删除 remove(Object o)
在这里插入图片描述
4.clear()方法 清空
在这里插入图片描述
5.set方法
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值