下面我将详细讲解 “ArrayList的自动扩充机制实例解析”的完整攻略。
什么是ArrayList
ArrayList是一个动态数组,可以随时添加、删除和修改元素。它实现了List
接口,继承了AbstractList
抽象类。由于它可以自动扩充容量,因此通常比静态数组更加方便易用。
ArrayList的自动扩充机制
当ArrayList添加元素时,若发现容量不足,ArrayList会自动扩充容量,以容纳更多的元素。默认情况下,ArrayList会将容量扩充为原来的1.5倍。
以下是ArrayList自动扩充机制的核心代码:
private void ensureCapacityInternal(int minCapacity) {
// 判断当前容量是否不足
if (minCapacity - elementData.length > 0) {
// 计算新容量值,增加原容量1.5倍
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 如果新容量还是不足,就直接使用minCapacity
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
// 复制旧数组到新数组
elementData = Arrays.copyOf(elementData, newCapacity);
}
}
它的执行流程如下:
- 判断当前容量是否不足,若不足则进行扩充
- 计算新容量值,增加原容量的1.5倍
- 如果新容量还是不足,就直接使用
minCapacity
- 复制旧数组到新数组,并将新数组赋值给ArrayList对象
ArrayList自动扩充机制的实例解析
假设我们在创建ArrayList时,使用了无参构造函数创建了一个初始容量为10的ArrayList对象,现在我们需要向其中添加100个元素,请看下面的示例代码:
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
// 创建一个初始容量为10的ArrayList对象
ArrayList<Integer> list = new ArrayList<>();
// 向ArrayList对象中添加100个元素
for (int i = 0; i < 100; i++) {
list.add(i);
}
}
}
上面的代码中,我们使用了ArrayList的add
方法,向列表中添加100个元素。由于原来的容量只有10,因此在添加第11个元素时,ArrayList就会触发自动扩充机制。
按照上面的自动扩充机制描述,我们可以对代码中的ensureCapacityInternal
方法进行调试,查看ArrayList对象实际发生了哪些改变。具体来说,我们可以在该方法中添加一些输出语句,以便观察ArrayList对象的容量和元素变化。修改后的代码如下:
private void ensureCapacityInternal(int minCapacity) {
// 判断当前容量是否不足
if (minCapacity - elementData.length > 0) {
// 计算新容量值,增加原容量1.5倍
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 如果新容量还是不足,就直接使用minCapacity
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
System.out.println("容量不足,扩充容量为" + newCapacity);
// 复制旧数组到新数组
elementData = Arrays.copyOf(elementData, newCapacity);
System.out.println("当前数组的元素个数为:" + size());
}
}
我们再次运行代码,控制台输出结果如下:
容量不足,扩充容量为15
当前数组的元素个数为:11
容量不足,扩充容量为22
当前数组的元素个数为:22
容量不足,扩充容量为33
当前数组的元素个数为:33
容量不足,扩充容量为50
当前数组的元素个数为:50
容量不足,扩充容量为75
当前数组的元素个数为:75
容量不足,扩充容量为112
当前数组的元素个数为:100
上面的输出结果显示了每次自动扩充容量时,ArrayList对象的容量和元素个数的变化情况。我们可以发现,ArrayList的实际容量确实是不足的,而它每次自动扩充容量时,都会按照1.5倍的规则进行扩充,直到容量足够为止。
另外一个示例
除了上面的示例,我们再看一个更简单的自动扩充机制的例子。假设我们现在仅希望在一个新的ArrayList中添加两个元素。在添加第一个元素时,ArrayList的容量为0,因此会触发自动扩充机制。由于该ArrayList只有两个元素,因此最终的容量只扩充到了2。具体的代码如下:
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
// 创建一个容量为0的ArrayList对象
ArrayList<Integer> list = new ArrayList<>(0);
// 向ArrayList对象中添加两个元素
list.add(1);
list.add(2);
}
}
在上面的示例中,我们使用了ArrayList的有参构造函数,指定了初始容量为0。在第一次添加元素时,ArrayList还没有任何容量,因此会先扩充到1,然后再扩充到2。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ArrayList的自动扩充机制实例解析 - Python技术站