Skip to content
第 26 / 250 章后端⏱ 10 分钟阅读

第 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

维度ArrayListLinkedList
底层动态数组双向链表
随机访问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

本站基于 VitePress 构建 · 由 Codebook 团队维护