深入解析 Java 集合框架:从底层原理到实战优化
Java集合是用于存储和管理一组对象的容器框架,主要分为单列集合(Collection)和双列集合(Map)两大类。 Collection包括List(有序可重复)、Set(无序不可重复)和Queue(队列),Map则通过键值对存储数据。核心实现类如ArrayList、LinkedList、HashSet、HashMap等,分别适用于不同场景。
一、Java 集合框架架构
Java 集合框架主要由以下几个部分组成:
-
核心接口
- Collection:存储单个元素的根接口
- List:有序、可重复的集合
- Set:无序、不可重复的集合
- Queue:队列接口
- Deque:双端队列接口
- Map:存储键值对的映射接口
-
实现类
- ArrayList、LinkedList、Vector、Stack(List 接口实现)
- HashSet、LinkedHashSet、TreeSet(Set 接口实现)
- PriorityQueue、ArrayDeque(Queue 接口实现)
- HashMap、LinkedHashMap、TreeMap、Hashtable、ConcurrentHashMap(Map 接口实现)
-
工具类
- Collections:提供静态方法操作集合
- Arrays:提供静态方法操作数组
- Comparator:自定义排序接口
- Comparable:自然排序接口
-
集合架构图
二、Collection 接口详解
1. 核心方法
add(E e)
:添加元素remove(Object o)
:删除元素contains(Object o)
:检查是否包含元素size()
:返回元素数量isEmpty()
:检查集合是否为空iterator()
:返回迭代器clear()
:清空集合toArray()
:转换为数组
2. 继承体系
- List 接口:有序、可重复
- Set 接口:无序、不可重复
- Queue 接口:队列特性(FIFO)
- Deque 接口:双端队列特性
三、List 接口实现类
1. ArrayList
- 底层实现:动态数组
- 扩容机制:初始容量 10,扩容为原容量的 1.5 倍
- 性能分析:
- 随机访问:O (1)
- 插入末尾:平均 O (1),扩容时 O (n)
- 插入中间:O (n)(需要移动元素)
- 删除:O (n)(需要移动元素)
- 线程安全:非线程安全
- 最佳实践:
// 指定初始容量避免频繁扩容 List<String> list = new ArrayList<>(100);
2. LinkedList
- 底层实现:双向链表
- 性能分析:
- 随机访问:O (n)
- 插入末尾:O (1)
- 插入中间:O (1)(已知位置)
- 删除:O (1)(已知位置)
- 线程安全:非线程安全
- 优势:实现了 List 和 Deque 接口,可作为队列、栈使用
- 最佳实践:
// 作为队列使用 Deque<String> queue = new LinkedList<>(); queue.offer("element"); // 入队 String element = queue.poll(); // 出队
3. Vector
- 底层实现:动态数组
- 扩容机制:初始容量 10,扩容为原容量的 2 倍
- 线程安全:所有方法同步,线程安全但性能较低
- 替代方案:ArrayList + Collections.synchronizedList()
- 最佳实践:
// 使用ArrayList替代Vector List<String> list = Collections.synchronizedList(new ArrayList<>());
4. Stack
- 底层实现:继承自 Vector
- 特点:后进先出(LIFO)
- 线程安全:线程安全但性能较低
- 替代方案:ArrayDeque(非线程安全)或使用同步包装
- 最佳实践:
// 使用ArrayDeque替代Stack Deque<String> stack = new ArrayDeque<>(); stack.push("element"); // 入栈 String element = stack.pop(); // 出栈
四、Set 接口实现类
1. HashSet
- 底层实现:基于 HashMap 实现
- 特点:
- 不允许重复元素
- 无序
- 允许 null 元素
- 性能分析:
- 插入、删除、查找:平均 O (1),最坏 O (n)(哈希冲突严重)