一、Java集合框架概览
Java集合框架(Java Collections Framework, JCF)是Java中用于存储和操作数据集合的核心工具,主要分为两大接口:
- Collection:存储单一元素(List、Set、Queue)
- Map:存储键值对(HashMap、TreeMap)
二、核心集合类详解
1. List接口(有序、可重复)
ArrayList
- 初始化:
List<String> list = new ArrayList<>();
List<String> list2 = new ArrayList<>(20);
- 排序:
Collections.sort(list);
Collections.sort(list, (a, b) -> b.compareTo(a));
- 长度:
list.size()
- 判空:
list.isEmpty()
- 使用场景:频繁随机访问(
get/set
),数据量较小。
- 注意事项:
- 线程不安全,多线程环境需同步。
- 扩容机制(默认扩容1.5倍),频繁插入需预分配容量。
LinkedList
List对比表
特性 |
ArrayList |
LinkedList |
底层结构 |
动态数组 |
双向链表 |
随机访问速度 |
O(1) |
O(n) |
头部插入/删除速度 |
O(n) |
O(1) |
内存占用 |
较低(无指针) |
较高(存储指针) |
2. Set接口(无序、唯一)
HashSet
TreeSet
Set对比表
特性 |
HashSet |
TreeSet |
底层结构 |
哈希表 |
红黑树 |
元素顺序 |
无序 |
自然/自定义排序 |
时间复杂度(增删查) |
O(1) 平均 |
O(log n) |
3. Queue接口(队列)
PriorityQueue
4. Map接口(键值对)
HashMap
- 初始化:
Map<String, Integer> map = new HashMap<>(20, 0.8f);
- 排序:
TreeMap<String, Integer> sortedMap = new TreeMap<>(map);
- 使用场景:快速键值存取、缓存实现。
- 注意事项:键对象需正确实现
hashCode()
和equals()
。
LinkedHashMap
- 使用场景:保留插入顺序或实现LRU缓存。
Map<String, Integer> lruCache = new LinkedHashMap<>(16, 0.75f, true) {
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > 100;
}
};
Map对比表
特性 |
HashMap |
TreeMap |
LinkedHashMap |
底层结构 |
哈希表 |
红黑树 |
哈希表+链表 |
顺序 |
无序 |
按键排序 |
插入/访问顺序 |
时间复杂度(增删查) |
O(1) 平均 |
O(log n) |
O(1) 平均 |
三、工具类与线程安全
1. Collections工具类
2. 线程安全集合
场景 |
非线程安全类 |
线程安全替代方案 |
高并发List |
ArrayList |
CopyOnWriteArrayList |
高并发Map |
HashMap |
ConcurrentHashMap |
高并发Queue |
PriorityQueue |
PriorityBlockingQueue |
四、最佳实践与使用场景
1. 常见场景推荐
需求 |
推荐集合 |
理由 |
快速查询元素 |
ArrayList / HashMap |
随机访问时间复杂度O(1) |
频繁插入删除(头尾) |
LinkedList |
链表操作时间复杂度O(1) |
数据去重 |
HashSet |
哈希表去重效率高 |
需要自然排序 |
TreeSet / TreeMap |
红黑树自动维护有序性 |
实现LRU缓存 |
LinkedHashMap |
通过accessOrder 和removeEldestEntry |
高并发环境 |
ConcurrentHashMap |
分段锁保证线程安全 |
2. 注意事项总结
- 线程安全:默认集合类非线程安全,多线程环境需显式同步。
- 初始容量:预估数据量,避免频繁扩容(如
ArrayList
默认扩容1.5倍)。
- 对象一致性:
HashSet
/HashMap
的键对象不可变,避免哈希值变化。
- 迭代器安全:遍历时修改集合可能引发
ConcurrentModificationException
。
五、Java 8+ 增强
Stream API操作集合
List<String> filteredList = list.stream()
.filter(s -> s.startsWith("A"))
.map(String::toUpperCase)
.collect(Collectors.toList());
六、总结
Java集合框架提供了丰富的工具类,开发者应根据具体需求选择合适的集合类型:
- 查询多 →
ArrayList
/ HashMap
- 增删多 →
LinkedList
/ LinkedHashMap
- 排序需求 →
TreeSet
/ TreeMap
- 线程安全 →
ConcurrentHashMap
/ CopyOnWriteArrayList
正确使用集合框架能显著提升代码性能和可维护性。建议结合场景需求,合理选择初始容量、排序方式及线程安全策略。