java集合源码分析①----ArrayList

本文详细介绍了ArrayList的内部实现,包括其默认初始容量、扩容机制以及相关操作如add、size、isEmpty、indexOf和get等。在JDK1.7和1.8中,ArrayList的默认容量有所不同。扩容时,数组容量会增长50%,并在必要时依据传入的最小容量进行调整。此外,文章还提及了获取元素、检查列表状态等基本操作的实现细节。
摘要由CSDN通过智能技术生成

ArrayList集合

ArrayList底层就是一个长度可以动态调整的Object数组
在这里插入图片描述
有一个记录数组长度的size字段
在这里插入图片描述

数组是默认长度是10,还准备有一个空的数组。
在这里插入图片描述
ArrayList有一个父类,并实现了List等多个接口(RandomAccess, Cloneable, java.io.Serializable接口中一个方法也没有)
在这里插入图片描述

无参创建

ArrayList list = new ArrayList();

JDK1.7中,使用无参数构造方法创建ArrayList对象时,默认底层数组长度是10。
JDK1.8中,使用无参数构造方法创建ArrayList对象时,默认底层数组长度是0,第一次添加元素,容量不足就要进行扩容了。
在这里插入图片描述
在这里插入图片描述
执行代码:

list.add(20);

在这里插入图片描述
扩容的具体实现:
在这里插入图片描述
在这里插入图片描述
每次扩容扩50%,扩大后再次进行比较
在这里插入图片描述
把数组的长度赋给oldCapacity

int oldCapacity = elementData.length;

新的数组容量=老的数组长度的1.5倍。oldCapacity >> 1 相当于除以2

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

如果新的数组容量newCapacity小于传入的参数要求的最小容量minCapacity,那么新的数组容量以传入的容量参数为准。

if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;

如果新的数组容量newCapacity大于数组能容纳的最大元素个数 MAX_ARRAY_SIZE 2^{31}-1-8
那么再判断传入的参数minCapacity是否大于MAX_ARRAY_SIZE,如果minCapacity大于MAX_ARRAY_SIZE,那么newCapacity等于Integer.MAX_VALUE,否者newCapacity等于MAX_ARRAY_SIZE。

if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);

其他方法:

//1
list.size();

直接返回size:
在这里插入图片描述

//2
list.isEmpty();

通过判断size是否为0,若长度为0则为空:
在这里插入图片描述

//3
list.indexOf(20);

内部通过一个for循环进行判断:
在这里插入图片描述

//4
list.get(2);

先验证索引是否超范围

在这里插入图片描述
超过范围(过大)报IndexOutOfBoundsException异常
在这里插入图片描述
索引为负数报运行时异常

//5
list.iterator();

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值