Java 集合框架:接口体系、常用实现、底层结构与线程安全
0. 时间和空间复杂度
表 1:常见时间复杂度(从快到慢)
| 时间复杂度 | 增长趋势(n 变大时) | 快慢等级 | 典型例子(直觉记忆) |
|---|---|---|---|
| O(1) | 不变 | ⭐⭐⭐⭐⭐ 最快 | 数组/ArrayList get(i);HashSet/HashMap 平均 contains/get |
| O(log n) | 增长很慢 | ⭐⭐⭐⭐ 很快 | 二分查找;TreeSet/TreeMap(红黑树)查找/增删 |
| O(n) | 成比例增长 | ⭐⭐⭐ 中等 | 遍历;ArrayList contains;LinkedList get(i) |
| O(n log n) | 比 n 慢一截 | ⭐⭐ 偏慢(但常用) | 排序(归并/快排平均);很多'排序 + 遍历' |
| O(n²) | 急剧增长 | ⭐ 慢 | 双重循环暴力比较(两两对比) |
| O(2^n) | 爆炸增长 | ❌ 很慢 | 子集枚举、暴力选或不选 |
| O(n!) | 更爆炸 | ❌❌ 最慢 | 全排列暴力(旅行商暴力) |
记忆口诀:1、log、n、nlogn、n²、2^n、n!(越往后越慢)
表 2:常见空间复杂度(从省到费)
| 空间复杂度 | 额外内存随 n 增长? | 省/费等级 | 典型例子(直觉记忆) |
|---|---|---|---|
| O(1) | 不增长 | ⭐⭐⭐⭐⭐ 最省 | 双指针、原地交换、只用几个变量 |
| O(log n) | 增长很慢 | ⭐⭐⭐⭐ 很省 | 递归栈(如二分、快排平均栈深) |
| O(n) | 线性增长 | ⭐⭐⭐ 常见 | HashSet/HashMap;辅助数组;队列/栈存 n 个元素 |
| O(n²) | 平方增长 | ⭐⭐ 很费 | 二维 DP 表 dp[n][n];邻接矩阵 |
| 更高 | 更快增长 | ⭐ 最费 | 三维 DP 等 |
记忆口诀:


