Java List 集合
List 是 Java 集合框架中最常用的接 口之一,用于存储有序、可重复的元素。理解 List 的实现类和使用方法是处理列表数据的基础。本章将详细介绍 Java 中的 List 集合。
ArrayList 与 LinkedList 对比
ArrayList
**ArrayList**是基于数组实现的动态数组。
特点:
- 随机访问快:通过索引访问元素,时间复杂度 O(1)
- 插入删除慢:需要移动元素,时间复杂度 O(n)
- 内存连续:元素在内存中连续存储
- 线程不安全:多线程环境下需要同步
import java.util.ArrayList;
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
// 随机访问
String first = list.get(0); // "apple"(O(1))
// 插入(中间位置)
list.add(1, "grape"); // O(n),需要移动元素
// 删除
list.remove(0); // O(n),需要移动元素
LinkedList
**LinkedList**是基于双向链表实现的。
特点:
- 插入删除快:在已知位置插入删除,时间复杂度 O(1)
- 随机访问慢:需要遍历链表,时间复杂度 O(n)
- 内存不连续:元素通过指针连接
- 线程不安全:多线程环境下需要同步
import java.util.LinkedList;
List<String> list = new LinkedList<>();
list.add("apple");
list.add("banana");
list.add("orange");
// 随机访问(慢)
String first = list.get(0); // O(n),需要遍历
// 插入(如果已知节点位置,O(1))
list.add(1, "grape");
// 删除(如果已知节点位置,O(1))
list.remove(0);
性能对比
| 操作 | ArrayList | LinkedList |
|---|---|---|
| 随机访问 | O(1) | O(n) |
| 插入(末尾) | O(1) | O(1) |
| 插入(中间) | O(n) | O(n) |
| 删除(末尾) | O(1) | O(1) |
| 删除(中间) | O(n) | O(n) |
| 内存占用 | 较小 | 较大(需要存储指针) |
选择建议
使用 ArrayList:
- 需要频繁随机访问
- 主要在末尾添加/删除元素
- 元素数量相对固定
使用 LinkedList:
- 需要频繁在中间插入/删除
- 不需要随机访问
- 元素数量变化较大
添加、删除、查找、遍历
添加元素
List<String> list = new ArrayList<>();
// 在末尾添加
list.add("apple"); // 返回 true
list.add("banana"); // 返回 true
// 在指定位置插入
list.add(1, "orange"); // 在索引 1 处插入
// 批量添加
List<String> anotherList = Arrays.asList("grape", "mango");
list.addAll(anotherList); // 添加所有元素
list.addAll(1, anotherList); // 在指定位置插入所有元素