java的queue类,java集合类深入分析之Queue篇

简介

Queue是一种很常见的数据结构类型,在Java里面Queue是一个接口,它只是定义了一个基本的Queue应该有哪些功能规约。实际上有多个Queue的实现,有的是采用线性表实现,有的基于链表实现。还有的适用于多线程的环境。java中具有Queue功能的类主要有如下几个:AbstractQueue,

ArrayBlockingQueue, ConcurrentLinkedQueue, LinkedBlockingQueue, DelayQueue, LinkedList, PriorityBlockingQueue, PriorityQueue和ArrayDqueue。在本文中,我们主要讨论常用的两种实现:LinkedList和ArrayDeque。

Queue

Queue本身是一种先入先出的模型(FIFO),和我们日常生活中的排队模型很类似。根据不同的实现,他们主要有数组和链表两种实现形式。如下图:

java的queue类,java集合类深入分析之Queue篇_第1张图片

java的queue类,java集合类深入分析之Queue篇_第2张图片

因为在队列里和我们日常的模型很近似,每次如果要出队的话,都是从队头移除。而如果每次要加入新的元素,则要在队尾加。所以我们要在队列里保存队头和队尾。

在jdk里几个常用队列实现之间的类关系图如下:

java的queue类,java集合类深入分析之Queue篇_第3张图片

我们可以看到,Deque也是一个接口,它继承了Queue的接口规范。我们要讨论的LinkedList和ArrayDeque都是实现Deque接口,所以,可以说他们俩都是双向队列。具体的实现我们会在后面讨论。Queue作为一个接口,它声明的几个基本操作无非就是入队和出队的操作,具体定义如下:

Java代码

134beedad545e7b5f4a9bd2dd4de7500.png

public interface Queue extends Collection {

boolean add(E e); // 添加元素到队列中,相当于进入队尾排队。

boolean offer(E e);  //添加元素到队列中,相当于进入队尾排队.

E remove(); //移除队头元素

E poll();  //移除队头元素

E element(); //获取但不移除队列头的元素

E peek();  //获取但不移除队列头的元素

}

有了这些接口定义的规约,我们就可以很容易的在后续的详细实现里察看具体细节。

Deque

按照我们一般的理解,Deque是一个双向队列,这将意味着它不过是对Queue接口的增强。

如果仔细分析Deque接口代码的话,我们会发现它里面主要包含有4个部分的功能定义。

1. 双向队列特定方法定义。

2. Queue方法定义。

3. Stack方法定义。

4. Collection方法定义。

第3,4部分的方法相当于告诉我们,具体实现Deque的类我们也可以把他们当成Stack和普通的Collection来使用。这也是接口定义规约带来的好处。这里我们就不再赘述。

我们重点来对Queue相关的定义方法做一下概括:

add相关的方法有如下几个:

Java代码

134beedad545e7b5f4a9bd2dd4de7500.png

boolean add(E e);

boolean offer(E e);

void addFirst(E e);

void addLast(E e);

boolean offerFirst(E e);

boolean offerLast(E e);

这里定义了add, offer两个方法,从doc说明上来看,两者的基本上没什么区别。

之所以定义了这两个方法是因为Deque继承了Collection, Queue两个接口,而这两个接口中都定义了增加元素的方法声明。

你可能感兴趣的:(java的queue类)