queue,deque
来源:互联网 发布:hadoop windows版本 编辑:程序博客网 时间:2024/04/26 18:37
from:http://uule.iteye.com/blog/2095650?utm_source=tuicool
1、Queue
API
在java5中新增加了java.util.Queue接口,用以支持队列的常见操作。该接口扩展了java.util.Collection接口。
- public interface Queue<E>
- extends Collection<E>
除了基本的 Collection 操作外,队列还提供其他的插入、提取和检查操作。
每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。使用或者!
队列通常(但并非一定)以 FIFO(先进先出)的方式排序各个元素。不过优先级队列和 LIFO 队列(或堆栈)例外,前者根据提供的比较器或元素的自然顺序对元素进行排序,后者按 LIFO(后进先出)的方式对元素进行排序。
在 FIFO 队列中,所有的新元素都插入队列的末尾,移除元素从队列头部移除。
Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常。 如果要使用前端而不移出该元素,使用element()或者peek()方法。
offer 方法可插入一个元素,否则返回 false。这与 Collection.add 方法不同,该方法只能通过抛出未经检查的异常使添加元素失败。
remove() 和 poll() 方法可移除和返回队列的头。到底从队列中移除哪个元素是队列排序策略的功能,而该策略在各种实现中是不同的。remove() 和 poll() 方法仅在队列为空时其行为有所不同:remove() 方法抛出一个异常,而 poll() 方法则返回 null。
element() 和 peek() 返回,但不移除,队列的头。
Queue 实现通常不允许插入 null 元素,尽管某些实现(如 LinkedList)并不禁止插入 null。即使在允许 null 的实现中,也不应该将 null 插入到 Queue 中,因为 null 也用作 poll 方法的一个特殊返回值,表明队列不包含元素。
值得注意的是LinkedList类实现了Queue接口,因此我们可以把LinkedList当成Queue来用。
- import java.util.Queue;
- import java.util.LinkedList;
- public class TestQueue {
- public static void main(String[] args) {
- Queue<String> queue = new LinkedList<String>();
- queue.offer("Hello");
- queue.offer("World!");
- queue.offer("你好!");
- System.out.println(queue.size());
- String str;
- while((str=queue.poll())!=null){
- System.out.print(str);
- }
- System.out.println();
- System.out.println(queue.size());
- }
- }
3
HelloWorld!你好!//poll为移出并且获取!!!
0
eg2:
package com.ljq.test;import java.util.LinkedList;import java.util.Queue;public class QueueTest { public static void main(String[] args) { //add()和remove()方法在失败的时候会抛出异常(不推荐) Queue<String> queue = new LinkedList<String>(); //添加元素 queue.offer("a"); queue.offer("b"); queue.offer("c"); queue.offer("d"); queue.offer("e"); for(String q : queue){ System.out.println(q); } System.out.println("==="); System.out.println("poll="+queue.poll()); //返回第一个元素,并在队列中删除 for(String q : queue){ System.out.println(q); } System.out.println("==="); System.out.println("element="+queue.element()); //返回第一个元素 for(String q : queue){ System.out.println(q); } System.out.println("==="); System.out.println("peek="+queue.peek()); //返回第一个元素 for(String q : queue){ System.out.println(q); } }}
a
b
c
d
e
===
poll=a
b
c
d
e
===
element=b
b
c
d
e
===
peek=b
b
c
d
e
2、Deque
API
- public interface Deque<E>
- extends Queue<E>
一个线性 collection,支持在两端插入和移除元素。
名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。
大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。
此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。因为此接口继承了队列接口Queue,所以其每种方法也存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。
a、在将双端队列用作队列时,将得到 FIFO(先进先出)行为。将元素添加到双端队列的末尾,从双端队列的开头移除元素。从 Queue 接口继承的方法完全等效于 Deque 方法,如下表所示:
b、用作 LIFO(后进先出)堆栈。应优先使用此接口而不是遗留 Stack 类。在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。堆栈方法完全等效于 Deque 方法,如下表所示:
eg:Deque 实现堆栈
import java.util.ArrayDeque;import java.util.Deque; public class IntegerStack { private Deque<Integer> data = new ArrayDeque<Integer>(); public void push(Integer element) { data.addFirst(element); } public Integer pop() { return data.removeFirst(); } public Integer peek() { return data.peekFirst(); } public String toString() { return data.toString(); } public static void main(String[] args) { IntegerStack stack = new IntegerStack(); for (int i = 0; i < 5; i++) { stack.push(i); } System.out.println("After pushing 5 elements: " + stack); int m = stack.pop(); System.out.println("Popped element = " + m); System.out.println("After popping 1 element : " + stack); int n = stack.peek(); System.out.println("Peeked element = " + n); System.out.println("After peeking 1 element : " + stack); }}
After pushing 5 elements: [4, 3, 2, 1, 0]
Popped element = 4
After popping 1 element : [3, 2, 1, 0]
Peeked element = 3
After peeking 1 element : [3, 2, 1, 0]
- queue,deque
- Queue&Deque
- Queue.Queue vs collections.deque
- stack,deque,queue对比
- Queue与Deque接口
- deque,list,queue,priority_queue
- stack,deque,queue对照
- deque queue and priority_queue
- stack,deque,queue对比
- deque,queue,stack,
- Queue AbstractQueue Deque 源代码
- stack queue deque 用法
- stack,deque,queue对比
- Queue和Deque
- stack,deque,queue对比
- stl--string queue deque
- c++ queue 和 deque
- stack,deque,queue对比
- 曝国安苏宁争夺威尔士当红前锋 开价500万镑年薪
- Entry是什么类型?
- LVS 工作模式以及工作原理
- 杭电2544 dijkstra 最短路
- Android播放远程非流MP4文件
- queue,deque
- Eclipse插件卸载
- 从输入一个URL开始后台发生什么
- Android横竖屏切换总结
- JavaScript--事件模型
- 线程安全的单例模式
- 使用Hibernate生成数据库和连接数据库
- 解决Setting property 'source' to 'org.eclipse.jst.jee.server的问题
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法