Queue 用于模拟队列这种数据结构。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。
Queue 接口中定义了如下几个方法:
Queue 接口有一个 PriorityQueue 实现类。此外,Queue 还有一个 Deque 接口,Deque 代表一个“双端列表”,双端队列可以同时从两端来添加、删除元素,因此 Deque 的实现类既可以当成队列使用,也可以当成栈使用。Java 为 Deque 提供了 ArrayQueue 和 LinkedList 两个实现类。
本文包含如下内容:
- PriorityQueue 实现类
- Deque 接口和 ArrayQueue 实现类
- LinkedList 实现类
- 各种线性表的性能分析
1. PriorityQueue 实现类
PriorityQueue 是一个比较标准的队列实现类。PriorityQueue 保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。因此调用peek() 方法或者 poll() 取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素。
从这个意义上看,PriorityQueue 违反了队列先进先出的规则。
2. Deque 接口与 ArrayQueue 实现类
Deque 接口是 Queue 接口的子接口,它代表一个双端队列,Deque 接口里定义了一些双端队列的方法,这些方法允许从两端来操作队列的元素。
Deque 不仅可以被当成双端队列使用,还可以被当成栈来使用,因为包含出栈和入栈方法。
Deque 的方法和 Queue 的方法对照表:
Deque 的方法与 Stack 的方法对照表:
Deque 接口提供了一个典型的实现类:ArrayDeque,从该名称可以看出,它是一个基于数组实现的双端队列,创建 Deque 时同样可指定一个 numElements 参数,该参数用于指定 Object[ ] 数组的长度;如果不指定 numElements 参数,Deque 底层数组的长度为 16。
下面程序示范将 ArrayDeque 当做 “栈”来使用:
此外 ArrayDeque 还可以当做队列使用,按“先进先出”的方式操作集合元素。
3. LinkedList 实现类
LinkedList 与 ArrayList、ArrayDeque、Vector 对比:
4. 各种线性表的性能分析
关于List 集合有如下建议:
- 如果需要遍历 List 集合元素,对于 ArrayList 、Vector 集合,应该使用随机访问访问(get)来遍历集合元素,这样性能更好;对于 LinkedList 集合,则应该采用 迭代器(Iterator)来遍历集合。
- 如果需要经常执行插入、删除操作来改变包含大量数据的 List 集合的大小,可考虑使用 LinkedList 集合。使用 ArrayList、Vector 集合可能需要经常重新分配内部数据的大小,效果可能差。
- 如果有多个线程同时访问 List 集合中的元素,开发者可考虑使用 Collections 将集合包装成线程安全的集合。