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()方法。如下表格:
抛出异常 | 返回特殊值 | 阻塞 | 等待指定时间 | |
入队(插入) | ||||
出队(移除) | ||||
检查 | 不可用 | 不可用 |
BlockingQueue的实现:
BlockingQueue是可以指定长度的,并且不能插入null值。
BlockingQueue的实现主要用于生产者/消费者模式(不属于23种设计模式之一)。在没有BlockingQueue的实现之前,我们都是利用Object的notify/notifyAll和wait方法来实现这种模式(也有利用Lock的Condition来实现的)。
BlockingQueue的实现还有一个很重要的地方就是,它们都是线程安全的。
Deque:双端队列
Deque双端队列是一种特殊的队列。就像它名字所说,它可以在两端进行操作。
具体方法如下表格:
第一个元素(头部) | 最后一个元素(尾部) | |||
抛出异常 | 返回特殊值 | 抛出异常 | 返回特殊值 | |
入队(插入) | ||||
出队(移除) | ||||
检查 |
由于Deque的特殊性,使得它可以像普通的Queue一样先进先出,具体方法如下表格:
Queue 的方法 | 等效 Deque 的方法 |
当然,Duque也可以像堆栈(Stock)一样后进先出(一般情况下优先使用Deque,不使用Stock),具体方法如下表格:
Stock的方法 | 等效 Deque 的方法 |