List
接口
特点:
- 有序集合(按插入顺序排列)
- 允许重复元素
- 支持按索引访问元素
主要实现类:
ArrayList
:基于动态数组实现,随机访问高效,插入删除较慢LinkedList
:基于双向链表实现,随机访问较慢,插入删除高效,实现了Queue接口Vector
:与ArrayList类似,但线程安全(方法使用synchronized修饰)Stack
:Vector的子类,实现了LIFO(后进先出)栈
使用场景:
- 需要按插入顺序保存数据时
- 需要频繁按位置访问元素时(ArrayList)
- 需要频繁在两端插入或删除元素时(LinkedList)
Set
接口
特点:
- 不允许重复元素
- 无序集合(除LinkedHashSet外)
- 最多只能有一个
null
元素
主要实现类:
HashSet
:基于HashMap
实现,无序,查找效率高 $O(1)$LinkedHashSet
:基于LinkedHashMap
实现,维护插入顺序,查找效率较高TreeSet
:基于TreeMap
(红黑树)实现,元素按自然顺序或指定比较器排序,查找效率 $O(log n)$
使用场景:
- 需要去重时
- 需要高效判断元素是否存在时(HashSet)
- 需要保持插入顺序且去重时(LinkedHashSet)
- 需要元素保持排序状态时(TreeSet)
Queue
接口
特点:
- 通常(但不一定)按FIFO(先进先出)方式排列元素
- 不同于其他集合,
Queue
提供了额外的插入、提取和检查操作
主要实现类:
LinkedList
:双向队列实现,可用作FIFO队列PriorityQueue
:基于优先级堆的优先队列,元素按自然顺序或指定比较器排序ArrayDeque
:基于动态数组的双端队列,比LinkedList更高效ConcurrentLinkedQueue
:线程安全的非阻塞队列
使用场景:
- 需要FIFO数据结构时
- 需要基于优先级处理元素时(PriorityQueue)
- 需要双端队列操作时(ArrayDeque)
- 多线程环境下的队列操作(ConcurrentLinkedQueue)
Map
接口
特点:
- 键值对映射关系
- 键不能重复,每个键最多映射一个值
- 不同于
Collection
接口的其他三种集合类型
主要实现类:
HashMap
:基于哈希表实现,无序,高效,允许null
键和值LinkedHashMap
:维护插入顺序或访问顺序,性能略低于HashMap
TreeMap
:基于红黑树实现,键按自然顺序或指定比较器排序Hashtable
:与HashMap
类似,但线程安全且不允许null
键和值ConcurrentHashMap
:线程安全的HashMap
,性能优于Hashtable
使用场景:
- 需要键值对映射时
- 需要高效查找时(HashMap)
- 需要保持插入顺序时(LinkedHashMap)
- 需要按键排序时(TreeMap)
- 多线程环境下(ConcurrentHashMap)
集合框架性能比较
集合类型 | 查找 | 插入/删除 | 有序性 | 线程安全 |
---|---|---|---|---|
ArrayList | $O(1)$ | $O(n)$ | 是(插入顺序) | 否 |
LinkedList | $O(n)$ | $O(1)$ | 是(插入顺序) | 否 |
HashSet | $O(1)$ | $O(1)$ | 否 | 否 |
LinkedHashSet | $O(1)$ | $O(1)$ | 是(插入顺序) | 否 |
TreeSet | $O(log n)$ | $O(log n)$ | 是(排序顺序) | 否 |
HashMap | $O(1)$ | $O(1)$ | 否 | 否 |
LinkedHashMap | $O(1)$ | $O(1)$ | 是(插入顺序) | 否 |
TreeMap | $O(log n)$ | $O(log n)$ | 是(键排序) | 否 |
ConcurrentHashMap | $O(1)$ | $O(1)$ | 否 | 是 |