Skip to content

03 集合框架与泛型

本章目标:掌握 List / Set / Map 常用结构与使用场景,理解泛型价值,避免集合相关常见性能坑。


1. 为什么需要集合

数组长度固定,操作不灵活;集合提供了更强的数据管理能力。

graph TD
    A[Collection] --> B[List]
    A --> C[Set]
    D[Map] --> E[HashMap]
    D --> F[TreeMap]
    B --> G[ArrayList]
    B --> H[LinkedList]
    C --> I[HashSet]
    C --> J[TreeSet]

2. List:有序可重复

2.1 ArrayList

  • 底层动态数组
  • 查询快,插入/删除中间元素相对慢
java
List<String> list = new ArrayList<>();
list.add("Java");
list.add("MySQL");
list.add("Spring");
System.out.println(list.get(1)); // MySQL

2.2 LinkedList

  • 底层双向链表
  • 头尾插入删除快,随机访问慢

3. Set:无序不重复

3.1 HashSet

  • 基于哈希表,去重高效
  • 不保证顺序
java
Set<String> set = new HashSet<>();
set.add("A");
set.add("A");
set.add("B");
System.out.println(set); // A, B

3.2 TreeSet

  • 自动排序(默认升序)
  • 适用于有序去重场景

4. Map:键值对结构

4.1 HashMap

  • 查询效率高
  • 键不能重复,允许一个 null
java
Map<String, Integer> scoreMap = new HashMap<>();
scoreMap.put("Tom", 90);
scoreMap.put("Jerry", 95);
System.out.println(scoreMap.get("Tom"));

4.2 TreeMap

  • 按 key 有序存储
  • 适合需要按 key 排序的场景

5. 泛型(Generics)

泛型用于“参数化类型”,提升类型安全,减少强转。

java
List<Integer> numbers = new ArrayList<>();
numbers.add(100);
// numbers.add("abc"); // 编译报错

常见泛型写法:

  • List<T>
  • Map<K, V>
  • class Box<T> { ... }

6. 集合遍历方式

java
for (String item : list) {
    System.out.println(item);
}
java
list.forEach(System.out::println);

7. 选型建议(实战)

  1. 频繁随机访问:ArrayList
  2. 频繁头尾增删:LinkedList
  3. 去重:HashSet
  4. 键值查询:HashMap
  5. 需要排序:TreeSet / TreeMap

8. 面试高频点

  1. ArrayListLinkedList 区别?
  2. HashMap 底层结构是什么?
  3. 为什么重写 equals() 往往还要重写 hashCode()
  4. 泛型擦除(Type Erasure)是什么?

9. 练习题

  1. 使用 Map<String, Integer> 统计字符串中每个字符出现次数。
  2. List<Integer> 中去重并排序。
  3. 自定义 Student 类,实现 HashSet 去重(按学号)。

10. 本章小结

  • 集合是 Java 开发的高频基础设施,选型能力直接影响代码质量和性能。
  • 泛型让代码更安全、可读性更强,是工程化 Java 的标配能力。