Queue extends Collection 队列实现了 Collection 接口,Collection接口是集合类的顶级接口,提供了一些对集合通用的操作方法,最常见的 add(增) ,remove(删),,size(查询)
下面就一点一点分析继承实现关系。
Queue 队列,顾名思义是一个以队列结构存储的容器,与Collection设计不同的是,它有两种状态,第一种他会对操作失败抛出异常来打断操作(比如add()操作时,如果超过队列的容量是将抛出异常),第二种就是正常操作不会抛出异常的。
抛异常 | Special value | |
插入 | add() | offer() |
删除 | remove() | pull() |
修剪 | element() | peek() |
修剪和删除的区别是,删除会返回对象并把它从容器内移除,修剪是只会返回对象不会删除, 还有就是如果集合里没有元素了,调用remove,或element 会抛出异常,而调用
pull, peek 只会返回空,不会抛出异常。
BlockingQueue extends Queue 阻塞队列,出了继承自Queue,他还定义了自己的一些方法,出了父类的,主要还有阻塞操作,和超时操作
抛异常 | Special value | 阻塞 | 超时 | |
插入 | add(e) | offer(e) | put(e) | offer(e, time, unit) |
删除 | remove() | poll() | take() | poll(time, unit) |
修剪 | element() | peek() | not applicable | not applicable |
put() 插入 当容器容量满了时,调用put()方法,调用者现成将被阻塞住wait,一直到其他线程消耗了容器里一个元素,阻塞住的线程才会被唤醒,执行插入的操作
take() 删除 同理,当容器类没有元素时,执行take()方法将会被wait住,直至容器内有元素才会被唤醒,在执行删除操作。
offer(e, time, unit) 插入,和put()方法一样,会阻塞,只不过提供了打断等待线程的时间参数,在指定的传入的时间内,没有没有被唤醒,该线程将被打断等待,抛出InterruptedException 异常。
poll(time, unit) (拉出一个元素来,hehe...)同take()一样会阻塞,它会在传入的指定时间内,没有被唤醒,该线程将被打断等待,抛出InterruptedException 异常。
Deque extends Queue (double ended queue 的缩写)双向队列,设计为一个线性存储机构的容器,继承自Queue接口,除了Queue父类的一般操作外,它还提供了对头和队尾的一些操作:
第一元素 (头) | 第二元素(Tail) | |||
抛异常 | Special value | 抛异常 | Special value | |
插入 | addFirst(e) | offerFirst(e) | addLast(e) | offerLast(e) |
删除 | removeFirst() | pollFirst() | removeLast() | pollLast() |
修剪 | getFirst() | peekFirst() | getLast() | peekLast() |
有以下两种情况,如果Deque被用作FIFO(First in First out)先进先出的结构队列,它对应的Queue操作方法如下:
Queue 方法 | 等价于 Deque 方法 |
add(e) | addLast(e) |
offer(e) | offerLast(e) |
remove() | removeFirst() |
poll() | pollFirst() |
element() | getFirst() |
peek() | peekFirst() |
Deque也可被用作LIFO(Last in First out)后进先出的结构stack ,当一个Deque 被用作一个stack时,它对应的压栈和弹栈操作方法如下:
Stack 方法 | 等价于 Deque 方法 |
push(e) | addFirst(e) |
pop() | removeFirst() |
peek() | peekFirst() |
BlockingDeque extends BlockingQueue, Deque 阻塞的双向队列,定义了一个操作阻塞的双向队列(有点绕口),具体介绍参照父类的定义,一些方法介绍如下:
First Element (Head) | ||||
抛异常 | Special value | 阻塞 | 超时 | |
插入 | addFirst(e) | offerFirst(e) | putFirst(e) | offerFirst(e, time, unit) |
删除 | removeFirst() | pollFirst() | takeFirst() | pollFirst(time, unit) |
修剪 | getFirst() | peekFirst() | not applicable | not applicable |
Last Element (Tail) | ||||
抛异常 | Special value | 阻塞 | 超时 | |
插入 | addLast(e) | offerLast(e) | putLast(e) | offerLast(e, time, unit) |
删除 | removeLast() | pollLast() | takeLast() | pollLast(time, unit) |
修剪 | getLast() | peekLast() | not applicable | not applicable |
对BlockQueue 的方法对应如下表:
BlockingQueue 方法 | 等价于BlockingDeque 方法 |
插入 | |
add(e) | addLast(e) |
offer(e) | offerLast(e) |
put(e) | putLast(e) |
offer(e, time, unit) | offerLast(e, time, unit) |
移除 | |
remove() | removeFirst() |
poll() | pollFirst() |
take() | takeFirst() |
poll(time, unit) | pollFirst(time, unit) |
修剪 | |
element() | getFirst() |
peek() | peekFirst() |
写这么多还是有点乱,总结下吧:
插入系列
addXXX :插入不成功 抛出异常
offerXXX:插入不成功返回false,否则返回true
putXXX:插入不成功,阻塞线程
offerXXX(xx,xx,xx):插入不成功,阻塞一定时间后被打断
删除系列
removeXXX:删除不成功 抛出异常
pollXXX:删除不成功返回false,否则返回true
takeXXX:删除不成功,阻塞线程
pollXXX(xx,xx,xx) :删除不成功,阻塞一定时间后被打断
修剪:
element() ==getFirst()或 getXXX(): 返回队头或队尾的元素,无则抛出异常
peekXXX():返回队头或队尾元素,无 则返回null