java单向队列和双向队列

1,407 阅读4分钟
原文链接: www.shsxt.com

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
绝提介绍参照BlockingQeque, Deque接口。

对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