ArrayList源码分析

本文主要介绍Java中ArrayList的构造方法和常用方法。构造方法有三种,包括无参和有参构造。常用方法涵盖get、add、remove、clear、set等,重点讲解了add方法的扩容机制,计算容量、判断扩容,新数组容量为原数组1.5倍,且ArrayList线程不安全。
           ## 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方法
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值