Queue用于模拟队列数据结构,采用“先进先出”的方式。Queue接口是继承了Collection的接口,而Queue接口下面的实现类是PriorityQueue,继承的接口是Deque,接口Deque接口的实现类是ArrayDeque,同时Deque还被LinkedList类实现。
框架结构如下图中红色区域:
PriorityQueue是一个比较标准的队列实现类。之所以是比较标准的原因是PriorityQueue保存队列元素的顺序并不是按照加入队列的顺序,而是按照队列元素的大小进行重新排序。因此当调用peek()或者是poll()的方法取出队列中的元素通常都是最小的元素。值得注意的是
peek()方法取出队列头部元素时候,不删除该元素,而poll()方法取出元素时会删除元素。如果遇到队列为空的情况是,两者都会返回null
package com.practice.collection; import java.util.PriorityQueue; public class PriorityQueueTest { public static void main(String[] args) { PriorityQueue priorityQueue = new PriorityQueue(); priorityQueue.offer(6); priorityQueue.offer(-3); priorityQueue.offer(20); priorityQueue.offer(18); System.out.println(priorityQueue); while(!priorityQueue.isEmpty()){ System.out.println(priorityQueue.poll()); } } }
PriorityQueue不允许插入null元素,还要对队列元素进行排序,两种排序方式:
Deque接口是Queue接口的子接口,代表一个双端队列。同时Deque不仅可以作为双端队列使用,而且可以被当成栈来使用,所以可以使用出栈,入栈的方法。
程序示例将ArrayDeque当做“栈”来操作
package com.practice.collection; import java.util.ArrayDeque; public class ArrayDequeStack { public static void main(String[] args) { ArrayDeque stack = new ArrayDeque(); stack.push(2); stack.push(5); stack.push(7); stack.push(12); System.out.println(stack); /** * peek(),element()该方法获取队列头部的元素,但是不删除该元素。 * poll()该方法也是获取队列头部的元素,但是删除该元素。 */ System.out.println(stack.peek()); System.out.println(stack); System.out.println(stack.pop()); System.out.println(stack); } }
程序示例将ArrayDeque当做“队列”来操作
package com.practice.collection; import java.util.ArrayDeque; public class ArrayDequeQueue { public static void main(String[] args) { ArrayDeque queue = new ArrayDeque<>(); queue.offer("JAVA SE"); queue.offer("JAVA EE"); queue.offer("ORACLE 11G"); queue.offer("NODE.JS"); System.out.println(queue); System.out.println(queue.peek()); System.out.println(queue); System.out.println(queue.poll()); System.out.println(queue); } }
LinkedList类是List接口的实现类,但是同时也是Deque接口实现类,所以LinkedList既可以当做双端队列来使用,也可以当做栈来使用
package com.practice.collection; import java.util.LinkedList; public class LinkedListTest { public static void main(String[] args) { LinkedList books = new LinkedList<>(); books.offer("疯狂Java讲义"); books.push("企业级应用"); books.offerFirst("疯狂Android讲义"); for(int i = 0;i < books.size();i ++){ System.out.println("遍历中:"+books.get(i)); } System.out.println(books.peekFirst()); System.out.println(books.peekLast()); System.out.println(books); System.out.println(books.pollLast()); System.out.println(books); } }
LinkedList与ArrayList,ArrayDeque的底层实现方式不同,ArrayList,ArrayDeque使用数组的形式来保存集合中的元素;LinkedList是采用链表的形式实现的,LinkedList因此比较适合用于经常插入和删除的操作,而以数组实现的更加适合于随机访问。