Java 集合框架概览
List/Set/Map 的职责分工、常用实现选型、迭代与并发边界入口。
#type / concept
#status / growing
#tech / dev
#resource / java
[!info] 关联笔记
Java 集合框架概览
这个概念为什么出现
真实业务很少只操作单个变量:购物车行、SKU 索引、去重标签、配置字典都需要集合。Java 集合框架用接口 + 实现分离“契约”与“数据结构选择”。
[!abstract] 一句话理解
List有序可重复,Set去重,Map键值索引;先选接口语义,再选ArrayList/HashSet/HashMap等实现,并遵守元素 equals/hashCode 契约。
最小可运行示例
场景:购物车维护商品行与优惠标签
import java.util.*;
public class CartCollections {
public static void main(String[] args) {
List<String> lines = new ArrayList<>();
lines.add("SKU-1");
lines.add("SKU-1"); // List 允许重复
System.out.println("lines=" + lines.size());
Set<String> tags = new HashSet<>();
tags.add("promo");
tags.add("promo"); // Set 去重
System.out.println("tags=" + tags.size());
Map<String, Integer> stock = new HashMap<>();
stock.put("SKU-1", 3);
stock.put("SKU-2", 0);
System.out.println("SKU-1=" + stock.get("SKU-1"));
System.out.println("missing=" + stock.get("SKU-9")); // null
}
}
建议运行:
javac CartCollections.java && java CartCollections
期望输出:
lines=2
tags=1
SKU-1=3
missing=null
结合场景再看三个关注点
- 接口类型声明变量(
List/Map),实现可替换。 - Map 未命中返回 null(或用
getOrDefault)。 - 去重依赖 equals/hashCode。
核心概念与准确模型
1. 核心接口
| 接口 | 语义 |
|---|---|
Collection | 单列集合根 |
List | 有序、下标、可重复 |
Set | 无重复 |
Map | 键值,键唯一 |
Queue/Deque | 队列/双端 |
2. 常用实现选型
| 需求 | 常见选择 |
|---|---|
| 随机访问列表 | ArrayList |
| 头尾频繁插入 | LinkedList(先测量) |
| 去重无序 | HashSet |
| 排序去重 | TreeSet |
| 键值检索 | HashMap |
| 键排序 | TreeMap |
| 保持插入序 | LinkedHashMap |
3. 迭代与修改
- for-each 时结构修改可能
ConcurrentModificationException - 用迭代器
remove或收集后删
4. 不可变集合
List.of/Map.of/copyOf- 返回只读视图防泄漏
边界情况与反直觉行为
HashMap允许一个 null 键(实现细节层面的常见行为);Hashtable/ConcurrentHashMap不同。TreeMap键必须可比较。- 集合不是线程安全默认——见并发集合篇。
常见误区
[!warning] 常见误区:返回 null List 返回空列表,避免调用方 NPE。
工程实践
- 方法参数尽量用接口类型。
- 暴露集合前包装不可变拷贝。
- 大键对象注意 hash 成本。
- 选型先语义后性能,性能靠测量。
本节总结
- List/Set/Map 语义三分
- 实现按访问模式选
- equals/hashCode 与并发边界决定正确性
自测题
- 何时用 Set 而不是 List?
- 为什么变量写成
List<String> x = new ArrayList<>()?
参考答案
- 需要去重/成员测试且不关心重复插入语义时。
- 依赖接口契约,便于替换实现与测试。
延伸阅读与资料来源
| 资料 | 类型 | 支撑内容 |
|---|---|---|
| Collections Framework Overview | 官方 | 框架总览 |
| List / Map API | API | 接口契约 |