从源码分析ArrayList集合

本文详细分析了ArrayList在Java集合框架中的实现,包括其构造函数、常用方法和元素操作。ArrayList基于数组实现,支持快速访问并能动态扩容。文章探讨了如size()、contains()、add()、remove()等关键操作的实现细节,并介绍了clone()、toArray()等方法。此外,还讨论了ArrayList的排序和子列表操作。
摘要由CSDN通过智能技术生成
好的,下面是源码分析ArrayList集合通过空参构造方法创建对象,并第一次添加元素的过程: 1. 首先,通过空参构造方法创建ArrayList对象,代码如下: ``` ArrayList<Object> arrayList = new ArrayList<>(); ``` 2. 在ArrayList类中,空参构造方法的实现如下: ``` public ArrayList() { // 默认初始容量为10 this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } ``` 其中,DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个空数组,定义如下: ``` private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; ``` 3. 接着,当第一次向ArrayList添加元素时,会调用ensureCapacityInternal()方法来确保容量足够存放新的元素。在这个过程中,如果当前容量不足,会自动进行扩容操作。代码如下: ``` arrayList.add("hello"); ``` 4. 在add()方法中,会先调用ensureCapacityInternal()方法进行容量检查和扩容操作,代码如下: ``` private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; // 当前容量小于所需最小容量时,进行扩容 if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { // 计算新容量,为原容量的1.5倍 int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; // 如果新容量超过了最大容量,则将新容量设置为Integer.MAX_VALUE if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // 进行数组复制,扩容 elementData = Arrays.copyOf(elementData, newCapacity); } ``` 5. 在ensureCapacityInternal()方法中,会先判断当前容量是否为默认初始容量,如果是,则将所需最小容量和默认容量进行比较,取较大值作为新容量。如果当前容量已经大于默认初始容量,则直接调用ensureExplicitCapacity()方法进行容量检查和扩容操作。 6. 在ensureExplicitCapacity()方法中,会先对modCount进行自增操作,然后判断当前容量是否小于所需最小容量,如果小于,则调用grow()方法进行扩容操作。 7. 在grow()方法中,会先计算出新容量,然后判断新容量是否超过了最大容量,如果超过,则将新容量设置为Integer.MAX_VALUE。最后,调用Arrays.copyOf()方法进行数组复制,完成扩容操作。 综上所述,ArrayList集合通过空参构造方法创建对象,并第一次添加元素的过程,主要就是进行容量检查和扩容操作。如果当前容量不足,就需要进行扩容操作,扩容后再添加元素。这个过程中,ArrayList会自动进行容量的调整,保证存储的元素数量不会超过当前容量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1 + 1=王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值