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:维护插入顺序或访问顺序,性能略低于HashMapTreeMap:基于红黑树实现,键按自然顺序或指定比较器排序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)$ | 否 | 是 |