Queue接口入门

Java中Queue接口其实就是一种常见的数据结构——单向队列。

它继承于Collection接口,也支持泛型。除了基本的Collection操作外,它还提供了其他的插入、移除、检查操作。每种操作都存在两种形式:一种抛出异常,另一种返回一个特殊值(null或false,取决于具体操作)。

 

抛出异常

返回特殊值

入队(插入)

add(e)

offer(e)

出队(移除)

remove()

poll()

检查

element()

peek()

Queue接口有两个重要的子接口:BlockingQueue和 Deque。

BlockingQueue:阻塞队列

为什么叫阻塞队列呢?因为它在Queue接口的基础上加了几个方法:put(e)和take(),并且重载了Queue接口offer(e)和poll()方法。如下表格:

 

抛出异常

返回特殊值

阻塞

等待指定时间

入队(插入)

add(e)

offer(e)

put(e)

offer(e, time, unit)

出队(移除)

remove()

poll()

take()

poll(time, unit)

检查

element()

peek()

不可用

不可用

BlockingQueue的实现:

BlockingQueue是可以指定长度的,并且不能插入null值。

BlockingQueue的实现主要用于生产者/消费者模式(不属于23种设计模式之一)。在没有BlockingQueue的实现之前,我们都是利用Object的notify/notifyAll和wait方法来实现这种模式(也有利用Lock的Condition来实现的)。

BlockingQueue的实现还有一个很重要的地方就是,它们都是线程安全的。

Deque:双端队列

Deque双端队列是一种特殊的队列。就像它名字所说,它可以在两端进行操作。

具体方法如下表格:

 

第一个元素(头部)

最后一个元素(尾部)

 

抛出异常

返回特殊值

抛出异常

返回特殊值

入队(插入)

addFirst(e)

offerFirst(e)

addLast(e)

offerLast(e)

出队(移除)

removeFirst()

pollFirst()

removeLast()

pollLast()

检查

getFirst()

peekFirst()

getLast()

peekLast()

由于Deque的特殊性,使得它可以像普通的Queue一样先进先出,具体方法如下表格:

Queue 的方法

等效 Deque 的方法

add(e)

addLast(e)

offer(e)

offerLast(e)

remove()

removeFirst()

poll()

pollFirst()

element()

getFirst()

peek()

peekFirst()

当然,Duque也可以像堆栈(Stock)一样后进先出(一般情况下优先使用Deque,不使用Stock),具体方法如下表格:

Stock的方法

等效 Deque 的方法

push(e)

addFirst(e)

pop()

removeFirst()

peek()

peekFirst()

 

你可能感兴趣的:(Java基础)