Queue 用于模拟队列这种数据结构。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。

Queue 接口中定义了如下几个方法:

java 集合唯一对象 java集合queue_List


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 集合唯一对象 java集合queue_java 集合唯一对象_02


java 集合唯一对象 java集合queue_数组_03

2. Deque 接口与 ArrayQueue 实现类

Deque 接口是 Queue 接口的子接口,它代表一个双端队列,Deque 接口里定义了一些双端队列的方法,这些方法允许从两端来操作队列的元素。

java 集合唯一对象 java集合queue_java 集合唯一对象_04


Deque 不仅可以被当成双端队列使用,还可以被当成栈来使用,因为包含出栈和入栈方法。

Deque 的方法和 Queue 的方法对照表:

java 集合唯一对象 java集合queue_双端队列_05


Deque 的方法与 Stack 的方法对照表:

java 集合唯一对象 java集合queue_java 集合唯一对象_06


Deque 接口提供了一个典型的实现类:ArrayDeque,从该名称可以看出,它是一个基于数组实现的双端队列,创建 Deque 时同样可指定一个 numElements 参数,该参数用于指定 Object[ ] 数组的长度;如果不指定 numElements 参数,Deque 底层数组的长度为 16。

java 集合唯一对象 java集合queue_双端队列_07


下面程序示范将 ArrayDeque 当做 “栈”来使用:

java 集合唯一对象 java集合queue_数组_08


此外 ArrayDeque 还可以当做队列使用,按“先进先出”的方式操作集合元素。

java 集合唯一对象 java集合queue_List_09

3. LinkedList 实现类

java 集合唯一对象 java集合queue_双端队列_10

java 集合唯一对象 java集合queue_List_11


LinkedList 与 ArrayList、ArrayDeque、Vector 对比:

java 集合唯一对象 java集合queue_双端队列_12


java 集合唯一对象 java集合queue_数组_13

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

关于List 集合有如下建议:

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