Queue 用于模拟队列这种数据结构。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。
Queue 接口中定义了如下几个方法:
Java 集合之 Queue 集合
Queue 接口有一个 PriorityQueue 实现类。此外,Queue 还有一个 Deque 接口,Deque 代表一个“双端列表”,双端队列可以同时从两端来添加、删除元素,因此 Deque 的实现类既可以当成队列使用,也可以当成栈使用。Java 为 Deque 提供了 ArrayQueue 和 LinkedList 两个实现类。

本文包含如下内容:

  1. PriorityQueue 实现类
  2. Deque 接口和 ArrayQueue 实现类
  3. LinkedList 实现类
  4. 各种线性表的性能分析

1. PriorityQueue 实现类

PriorityQueue 是一个比较标准的队列实现类。PriorityQueue 保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。因此调用peek() 方法或者 poll() 取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素。
从这个意义上看,PriorityQueue 违反了队列先进先出的规则。
Java 集合之 Queue 集合
Java 集合之 Queue 集合

2. Deque 接口与 ArrayQueue 实现类

Deque 接口是 Queue 接口的子接口,它代表一个双端队列,Deque 接口里定义了一些双端队列的方法,这些方法允许从两端来操作队列的元素。
Java 集合之 Queue 集合
Deque 不仅可以被当成双端队列使用,还可以被当成栈来使用,因为包含出栈和入栈方法。
Deque 的方法和 Queue 的方法对照表:
Java 集合之 Queue 集合
Deque 的方法与 Stack 的方法对照表:
Java 集合之 Queue 集合
Deque 接口提供了一个典型的实现类:ArrayDeque,从该名称可以看出,它是一个基于数组实现的双端队列,创建 Deque 时同样可指定一个 numElements 参数,该参数用于指定 Object[ ] 数组的长度;如果不指定 numElements 参数,Deque 底层数组的长度为 16。
Java 集合之 Queue 集合
下面程序示范将 ArrayDeque 当做 “栈”来使用:
Java 集合之 Queue 集合
此外 ArrayDeque 还可以当做队列使用,按“先进先出”的方式操作集合元素。
Java 集合之 Queue 集合

3. LinkedList 实现类

Java 集合之 Queue 集合Java 集合之 Queue 集合
LinkedList 与 ArrayList、ArrayDeque、Vector 对比:
Java 集合之 Queue 集合
Java 集合之 Queue 集合

4. 各种线性表的性能分析

关于List 集合有如下建议:

  1. 如果需要遍历 List 集合元素,对于 ArrayList 、Vector 集合,应该使用随机访问访问(get)来遍历集合元素,这样性能更好;对于 LinkedList 集合,则应该采用 迭代器(Iterator)来遍历集合。
  2. 如果需要经常执行插入、删除操作来改变包含大量数据的 List 集合的大小,可考虑使用 LinkedList 集合。使用 ArrayList、Vector 集合可能需要经常重新分配内部数据的大小,效果可能差。
  3. 如果有多个线程同时访问 List 集合中的元素,开发者可考虑使用 Collections 将集合包装成线程安全的集合。

相关文章: