Java 集合框架完全指南:接口、实现、算法与最佳实践
Java Collections Framework(JCF)是统一的数据结构架构,提供接口、实现、算法三大支柱,位于 java.util 包。取代早期零散类,实现高性能、高互操作、易扩展。
核心接口体系
Collection (根接口)
├── List // 有序、可重复
│ ├── ArrayList
│ ├── LinkedList
│ └── Vector (遗留)
├── Set // 无序、唯一
│ ├── HashSet
│ ├── LinkedHashSet (插入序)
│ └── TreeSet (有序)
└── Queue // 队列
├── PriorityQueue
├── ArrayDeque
└── LinkedList
Map (键值映射,非 Collection 子接口)
├── HashMap
├── LinkedHashMap (插入序)
├── TreeMap (键有序)
├── WeakHashMap (弱键)
├── IdentityHashMap (恒等比较)
└── Hashtable (遗留)
主要实现类特性对比
| 实现 | 底层结构 | 有序性 | 线程安全 | Null键值 | 典型场景 |
|---|---|---|---|---|---|
| ArrayList | 动态数组 | 插入序 | ❌ | 允许 | 随机访问多、尾部增删 |
| LinkedList | 双向链表 | 插入序 | ❌ | 允许 | 头尾频繁增删、队列/栈 |
| HashSet | HashMap | 无序 | ❌ | 允许1个null | 去重、集合运算 |
| LinkedHashSet | LinkedHashMap | 插入序 | ❌ | 允许1个null | 去重+保持顺序 |
| TreeSet | 红黑树 | 自然序/定制序 | ❌ | 不允许null | 排序去重、区间查询 |
| HashMap | 数组+链表/红黑树 | 无序 | ❌ | 允许1键null、多值null | 通用键值存储 |
| LinkedHashMap | 双向链表+哈希 | 插入/访问序 | ❌ | 允许 | LRU缓存、有序映射 |
| TreeMap | 红黑树 | 键有序 | ❌ | 键不允许null | 排序映射、NavigableMap |
| ConcurrentHashMap | CAS+同步块 | 无序 | ✅ 高并发 | 不允许null | 高并发读写 |
核心算法
Collections 工具类提供静态算法(多态:同一方法适配多实现):
- 排序:
sort(List)、sort(List, Comparator) - 查找:
binarySearch(List, key)、max/min(Collection) - 洗牌:
shuffle(List) - 填充/复制:
fill(List, obj)、copy(dest, src) - 同步包装:
synchronizedList/Set/Map() - 不可变视图:
unmodifiableList/Set/Map()
Iterator 与 ListIterator
// 通用遍历
for (Iterator it = list.iterator(); it.hasNext(); ) {
String s = it.next();
if (s.isEmpty()) it.remove(); // 安全删除
}
// List 专用:双向、可修改、可定位
ListIterator lit = list.listIterator();
while (lit.hasNext()) lit.next();
while (lit.hasPrevious()) System.out.println(lit.previous());
Comparator 与 Comparable
| 接口 | 位置 | 方法 | 用途 |
|---|---|---|---|
| Comparable | 实体类内部 | compareTo(T o) | 自然排序(单一维度) |
| Comparator | 外部独立 | compare(T o1, T o2) | 多种排序策略、不可修改类 |
// Lambda 简写 Comparator
list.sort(Comparator.comparing(User::getAge).thenComparing(User::getName));
并发安全集合
CopyOnWriteArrayList:读多写少,写时复制数组ConcurrentHashMap:分段锁/CAS,高并发 Map 首选ConcurrentLinkedQueue:无界非阻塞队列BlockingQueue族:ArrayBlockingQueue、LinkedBlockingQueue,生产者消费者
性能选型速查
- 默认 List:
ArrayList - 队列/栈/双端:
ArrayDeque - 去重/成员测试:
HashSet - 去重+顺序:
LinkedHashSet - 排序去重:
TreeSet - 键值存储:
HashMap - 键值+顺序:
LinkedHashMap - 键值+排序:
TreeMap - 高并发 Map:
ConcurrentHashMap - 线程安全 List:
CopyOnWriteArrayList(读多写少)
避坑指南
- ❌ 作为 key 的对象未重写
equals/hashCode - ❌ 迭代中直接
list.remove()→ 用Iterator.remove() - ❌
HashMap多线程并发 put → 死循环/数据丢失,用ConcurrentHashMap - ❌
ArrayList频繁头部插入 → O(n²),改LinkedList或ArrayDeque - ❌ 以容量 10 创建大列表 → 频繁扩容,预估用
new ArrayList<>(capacity)
java
- C# 集合实战教程:ArrayList、Stack、Queue、Hashtable 等核心类型全解析
- 精通 Java 运算符:类型、语法与实战示例
- Java 注释:类型、用法与最佳实践
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- Java 集合框架完全指南:接口、实现、算法与最佳实践
- Java 10 垃圾收集器接口与 G1 并行 Full GC