Java基础之ArrayList的扩容机制
ArrayList简介
在Java中,ArrayList是一种常见的数据结构之一。它继承了AbstractList这个类,并且实现了List接口。ArrayList是基于数组实现的,可以动态地增加或减少数组的大小,所以可以自动扩容和缩容。
扩容机制
ArrayList的扩容机制指的是当ArrayList内部的元素个数超过了数组的容量时,ArrayList会自动扩容,将数组的容量扩大一倍。
ArrayList的扩容机制是在add()方法中实现的。每次调用add()方法进行添加元素时,都会动态检测数组是否满足扩容条件。如果不满足,则通过Arrays.copyOf()方法新建一个更大的数组,并将原数组中的元素复制到新数组中,然后将新元素添加到新数组的末尾。
具体的扩容机制如下:
- 调用add()方法,判断当前元素个数和数组容量是否相等,如果相等,则执行扩容操作。
- 计算新数组的容量,如果当前数组大小为0,则新数组容量为默认容量10,否则容量为原来的2倍。
- 调用Arrays.copyOf()方法,将原数组复制到新数组中。
- 将新元素添加到新数组的末尾。
示例1:扩容前的ArrayList打印容量和元素个数
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
System.out.println("当前容量为:" + getCapacity(list));
System.out.println("当前元素个数为:" + list.size());
}
private static int getCapacity(ArrayList list) {
try {
java.lang.reflect.Field field = ArrayList.class.getDeclaredField("elementData");
field.setAccessible(true);
return ((Object[])field.get(list)).length;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
输出:
当前容量为:10
当前元素个数为:0
示例2:扩容后的ArrayList打印容量和元素个数
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>(10);
for(int i = 0; i < 11; i++) {
list.add(i); // 添加11个元素
}
System.out.println("扩容后的容量为:" + getCapacity(list));
System.out.println("当前元素个数为:" + list.size());
}
private static int getCapacity(ArrayList list) {
try {
java.lang.reflect.Field field = ArrayList.class.getDeclaredField("elementData");
field.setAccessible(true);
return ((Object[])field.get(list)).length;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
输出:
扩容后的容量为:20
当前元素个数为:11
总结
ArrayList在添加元素时,会检查当前元素个数是否超过数组的容量,如果超过了,就会自动扩容。扩容是通过创建一个新数组,将原数组中的元素复制到新数组中,再将新元素添加到新数组的末尾实现的。每次扩容,都会将数组的容量扩大一倍。扩容机制保证了ArrayList在添加元素时可以自动增加数组的容量,从而满足动态数组的需求。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java基础之ArrayList的扩容机制 - Python技术站