第 26 章:集合框架入门 — Collection 与 List
学习目标
- 理解集合框架的整体架构
- 掌握 List 接口及其实现类
- 了解 ArrayList 和 LinkedList 的底层差异
一、集合框架全景图
二、List 接口
List:有序、可重复、可以按索引访问。
java
List<String> list = new ArrayList<>();
list.add("A"); // ① 添加
list.add("B");
list.add(0, "C"); // ② 指定索引插入
list.get(0); // ③ 按索引取
list.set(0, "X"); // ④ 修改
list.remove(0); // ⑤ 按索引删除
list.size(); // ⑥ 长度三、ArrayList vs LinkedList
| 维度 | ArrayList | LinkedList |
|---|---|---|
| 底层 | 动态数组 | 双向链表 |
| 随机访问 | O(1) | O(n) |
| 插入 / 删除 | O(n) | O(1) |
| 内存占用 | 较少 | 较多(节点指针) |
| 适用场景 | 查多改少 | 增删多 |
何时用哪个?
java
// ✅ 99% 场景用 ArrayList
List<User> users = new ArrayList<>();
// ⚠️ 频繁插入删除(如队列、栈)才用 LinkedList
Queue<Task> tasks = new LinkedList<>();四、ArrayList 扩容机制
默认扩容 1.5 倍(Java 8+),预分配大小可减少扩容开销。
五、List 常用方法
java
List<String> list = new ArrayList<>(List.of("A", "B", "C", "D"));
// 增
list.add("E"); // 末尾
list.add(0, "F"); // 指定位置
// 删
list.remove("A"); // 按内容
list.remove(0); // 按索引
// 改查
list.set(0, "X"); // 修改
list.get(0); // 访问
list.indexOf("C"); // 查找位置
// 视图
List<String> sub = list.subList(1, 3);
// 遍历
for (String s : list) { } // for-each
list.forEach(System.out::println); // 方法引用
// 排序
list.sort(Comparator.naturalOrder());
// 转数组
String[] arr = list.toArray(new String[0]);六、不可变 List
java
// JDK 9+
List<String> immutable = List.of("A", "B", "C");
// immutable.add("D"); // ❌ UnsupportedOperationException七、本章小结
| 要点 | 关键 |
|---|---|
| Collection | 集合根接口 |
| List | 有序、可重复 |
| ArrayList | 默认首选,数组实现 |
| LinkedList | 频繁增删时考虑 |
| 扩容 | 1.5 倍增长 |
动手练习
练习 1:基础题
实现一个 removeAll:从 list 中移除所有指定值。
java
public static <T> void removeAll(List<T> list, T value)练习 2:进阶题
比较 ArrayList 和 LinkedList 在 100 万次操作上的性能差异(用 System.currentTimeMillis())。
下一章:第 27 章:Set 与 Map →