Java ArrayList 是 Java 集合框架(Java Collections Framework)中的一个核心类,属于 java.util 包。它实现了 List 接口,是一个动态数组,可以根据需要自动调整大小(扩容或缩容),提供了比传统数组更灵活的操作方式。
ArrayList 的核心特点
- 动态扩容
- 传统数组(如
int[])长度固定,而ArrayList可以动态增长或缩小。 - 当元素数量超过当前容量时,
ArrayList会自动扩容(通常扩容为原来的 1.5 倍)。
- 传统数组(如
- 基于索引的随机访问
- 支持通过索引(
get(index))快速访问元素,时间复杂度为 O(1)。
- 支持通过索引(
- 允许重复元素
- 可以存储重复的元素(与
Set不同)。
- 可以存储重复的元素(与
- 有序性
- 元素按插入顺序存储,可以通过索引访问或遍历。
- 非线程安全
ArrayList不是线程安全的,多线程环境下需要手动同步或使用CopyOnWriteArrayList等线程安全类。
ArrayList 的基本用法
1. 创建 ArrayList
java
import java.util.ArrayList;
// 创建一个空的 ArrayList(默认初始容量为 10)
ArrayList<String> list = new ArrayList<>();
// 指定初始容量(减少扩容次数,提高性能)
ArrayList<Integer> numbers = new ArrayList<>(20);
2. 常用操作
java
// 添加元素
list.add("Apple"); // 添加到末尾
list.add(0, "Banana"); // 在索引 0 处插入
// 访问元素
String fruit = list.get(0); // 获取索引 0 的元素
// 修改元素
list.set(0, "Orange"); // 将索引 0 的元素改为 "Orange"
// 删除元素
list.remove(0); // 删除索引 0 的元素
list.remove("Apple"); // 删除第一个匹配的 "Apple"
// 获取大小
int size = list.size(); // 返回元素数量
// 检查是否包含元素
boolean containsApple = list.contains("Apple");
// 清空列表
list.clear();
3. 遍历 ArrayList
java
// 方式 1:增强 for 循环
for (String item : list) {
System.out.println(item);
}
// 方式 2:迭代器
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
// 方式 3:Java 8+ forEach + Lambda
list.forEach(item -> System.out.println(item));
ArrayList vs 数组
| 特性 | ArrayList | 数组(如 int[]) |
|---|---|---|
| 长度 | 动态可变 | 固定长度 |
| 内存开销 | 稍高(存储额外信息) | 较低 |
| 功能 | 提供丰富的 API(如 add()、remove()) |
仅支持基本操作(索引访问) |
| 性能 | 插入/删除较慢(需移动元素) | 随机访问快(O(1)) |
| 适用场景 | 需要频繁增删元素 | 已知固定大小且无需修改 |
ArrayList 的底层实现
- 内部使用数组 :
ArrayList内部维护了一个Object[] elementData数组来存储元素。 - 扩容机制:当元素数量超过当前数组长度时,会创建一个更大的新数组(通常是原大小的 1.5 倍),并将旧数组内容复制到新数组。
何时使用 ArrayList?
- 需要频繁增删元素(尤其是末尾)。
- 需要随机访问元素(通过索引)。
- 不确定最终数据大小,希望动态调整。
何时避免使用 ArrayList?
- 多线程环境(需改用
Vector或CopyOnWriteArrayList)。 - 需要频繁在头部或中间 插入/删除元素(考虑
LinkedList)。
示例代码
java
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<String> fruits = new ArrayList<>();
// 添加元素
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
// 遍历
for (String fruit : fruits) {
System.out.println(fruit);
}
// 删除元素
fruits.remove("Banana");
// 检查大小
System.out.println("Size: " + fruits.size());
}
}
输出:
java
Apple
Banana
Cherry
Size: 2