ArrayList
Java 集合框架中最常用的类之一。ArrayList
是基于数组的动态数组,它提供了动态增长和缩减容量的功能,因此非常适合存储和操作元素数量可变的集合。
一、底层原理:
1. 数组
ArrayList
使用一个数组来存储元素。初始时,ArrayList
创建一个固定大小的数组来保存元素。当数组已满时,ArrayList
会创建一个新的更大的数组,并将所有元素从旧数组复制到新数组中。
2. 动态增长
当向 ArrayList
中添加元素时,它会检查当前数组是否已满。如果数组已满,ArrayList
会创建一个新的数组,其大小通常是当前数组大小的两倍,然后将所有元素从旧数组复制到新数组中。这样做的目的是为了避免在添加新元素时频繁地调整数组的大小,从而提高性能。
3. 数组大小调整策略
ArrayList
实现了一种称为 “grow” 的策略,即当数组容量不足时,新数组的大小通常是当前数组大小的两倍。这种策略旨在平衡内存占用和性能。通常情况下,ArrayList
的添加操作的时间复杂度是 O(1),但在数组容量不足时可能会触发 O(n) 的复制操作,其中 n 是当前元素数量。
4. 容量控制
ArrayList
允许通过 ensureCapacity(int minCapacity)
方法手动设置底层数组的容量。这个方法可以用于在大量元素添加之前预先分配足够的内存,以提高性能。
总之,ArrayList
底层原理是基于数组实现的,通过动态增长和调整数组大小来实现动态数组的功能。这种设计使得 ArrayList
在添加、删除元素时能够保持较好的性能表现。
二、用法示例:
1. 创建 ArrayList
import java.util.ArrayList;
// 创建一个 ArrayList 对象
ArrayList<String> list = new ArrayList<>();
2. 添加元素
// 添加单个元素
list.add("Apple");
// 在指定位置添加元素
list.add(1, "Banana");
3. 获取元素
// 获取指定位置的元素
String fruit = list.get(0);
4. 修改元素
// 修改指定位置的元素
list.set(0, "Orange");
5. 删除元素
// 删除指定位置的元素
String removedElement = list.remove(1);
// 删除指定元素的第一个匹配项
boolean isRemoved = list.remove("Banana");
6. 获取大小
// 获取 ArrayList 的大小(元素数量)
int size = list.size();
7. 检查是否为空
// 检查 ArrayList 是否为空
boolean isEmpty = list.isEmpty();
8. 迭代遍历
// 使用 for-each 循环遍历 ArrayList
for (String item : list) {
System.out.println(item);
}
// 使用迭代器遍历 ArrayList
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String item = iterator.next();
System.out.println(item);
}
9. 转换为数组
// 将 ArrayList 转换为数组
String[] array = list.toArray(new String[0]);
10. 清空 ArrayList
// 清空 ArrayList
list.clear();