Queue Queue 是一个 FIFO(先进先出)的数据结构,并发中使用较多,可以安全地将对象从一个任务传给另一个任务。其形式类似于日常生活中的排队。
Java 集合中的 Queue 继承自 Collection 接口 ,Deque, LinkedList, PriorityQueue, BlockingQueue 等类都实现了它。 Queue 用来存放 等待处理元素 的集合,这种场景一般用于缓冲、并发访问。 除了继承 Collection 接口的一些方法,Queue 还添加了额外的 添加、删除、查询操作。
Queue Method Introduction
优先考虑右侧方法
add(E), offer(E) 在尾部添加:
区别: 一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。 这时新的 offer 方法就可以起作用了。它不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。
remove(), poll() 删除并返回头部:
区别:remove() 和 poll() 方法都是从队列中删除第一个元素。remove() 的行为与 Collection 接口的版本相似, 但是新的 poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。
peek, element 获取但不删除
区别: element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 package DataStructure;import java.util.LinkedList;import java.util.Queue;public class QueueType { public static void main (String[] args) { Queue<String> queue = new LinkedList<String>(); queue.offer("a" ); queue.offer("b" ); queue.offer("c" ); queue.offer("d" ); queue.offer("e" ); for (String x:queue) System.out.print(x + " " ); System.out.print("\n*********************\n" ); System.out.println("pull=" + queue.poll() +" remove=" +queue.remove()); for (String x:queue) System.out.print(x + " " ); System.out.print("\n*********************\n" ); System.out.println("element=" + queue.element()); for (String x:queue) System.out.print(x + " " ); System.out.println("\npeek=" + queue.peek()); for (String x:queue) System.out.print(x + " " ); } }
演示结果:
1 2 3 4 5 6 7 8 9 a b c d e ********************* pull=a remove=b c d e ********************* element=c c d e peek=c c d e
Deque 双端队列(deque,全名double-ended queue)可以让你在任何一端添加或者移除元素,因此它是一种具有队列和栈性质的数据结构。
Deque方法详解
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 package DataStructure;import java.util.Deque;import java.util.LinkedList;public class DequeType { public static void main (String[] args) { Deque<String> dq = new LinkedList<String>(); dq.offerFirst("a" ); dq.offerFirst("b" ); dq.offerLast("c" ); dq.offerLast("d" ); for (String x:dq) System.out.print(x + " " ); System.out.print("\n*********************\n" ); System.out.println(dq.removeFirst()); for (String x:dq) System.out.print(x + " " ); System.out.print("\n*********************\n" ); System.out.println(dq.pollLast()); for (String x:dq) System.out.print(x + " " ); System.out.print("\n*********************\n" ); System.out.print(dq.peekLast()); System.out.print("\n*********************\n" ); dq.addLast("a" ); dq.addLast("c" ); dq.addLast("a" ); System.out.println("当前队列:" + dq); dq.removeFirstOccurrence("a" ); System.out.println("第一次删除后的队列:" + dq); dq.removeLastOccurrence("a" ); System.out.println("第二次删除后的队列:" + dq); } }
演示结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 b a c d ********************* b a c d ********************* d a c ********************* c ********************* 当前队列:[a, c, a, c, a] 第一次删除后的队列:[c, a, c, a] 第二次删除后的队列:[c, a, c]
Stack 栈是Vector的一个子类,它实现了一个标准的(LIFO)后进先出的栈。
堆栈只定义了默认构造函数,用来创建一个空栈。 堆栈除了包括由Vector定义的所有方法,也定义了自己的一些方法:
还有些遗传至Vector, Object 与 Collection的方法
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 package DataStructure;import java.util.Stack;public class StackDemo { public static void main (String[] args) { StackDemo sd = new StackDemo(); Stack<Integer> st = new Stack<Integer>(); sd.showPush(st,45 ); sd.showPush(st, 65 ); sd.showPush(st, 85 ); System.out.println("peek the top Element:" + st.peek()); System.out.println("search Element position:" + st.search(65 )); sd.showPop(st); sd.showPop(st); sd.showPop(st); System.out.println("Judge isEmpty:" + st.empty()); } void showPush (Stack st, int num) { st.push(num); System.out.println("push(" + num + ")" ); System.out.println("stack: " + st); } void showPop (Stack st) { System.out.print("pop -> " ); Integer a = (Integer) st.pop(); System.out.println(a); System.out.println("stack: " + st); } }
演示结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 push(45 ) stack: [45 ] push(65 ) stack: [45 , 65 ] push(85 ) stack: [45 , 65 , 85 ] peek the top Element:85 search Element position:2 pop -> 85 stack: [45 , 65 ] pop -> 65 stack: [45 ] pop -> 45 stack: [] Judge isEmpty:true
参考文档