Java里有一个叫做Stack的类,却没有叫做Queue的类(它是个接口名字)。当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque;
既然Queue只是一个接口,当需要使用队列时也就首选ArrayDeque了(次选是LinkedList)。
队列常用方法
初始化
import java.util.LinkedList;import java.util.Queue;Queue<Integer> queue_input = new LinkedList<>();
| Queue Method | Equivalent Deque Method | 说明 |
|---|---|---|
| add(e) | addLast(e) | 向队尾插入元素,失败则抛出异常 |
| offer(e) | offerLast(e) | 向队尾插入元素,失败则返回false,offer(E e)操作是专为容量受限的队列实现而设计的,在大多数实现中,插入操作不会失败 |
| remove() | removeFirst() | 获取并删除队首元素,失败则抛出异常 |
| poll() | pollFirst() | 获取并删除队首元素,失败则返回null |
| element() | getFirst() | 获取但不删除队首元素,失败则抛出异常 |
| peek() | peekFirst() | 获取但不删除队首元素,失败则返回null |
栈常用方法
| Stack Method | Equivalent Deque Method | 说明 |
|---|---|---|
| push(e) | addFirst(e) | 向栈顶插入元素,失败则抛出异常 |
| 无 | offerFirst(e) | 向栈顶插入元素,失败则返回false |
| pop() | removeFirst() | 获取并删除栈顶元素,失败则抛出异常 |
| 无 | pollFirst() | 获取并删除栈顶元素,失败则返回null |
| peek() | peekFirst() | 获取但不删除栈顶元素,失败则抛出异常 |
| 无 | peekFirst() | 获取但不删除栈顶元素,失败则返回null |
关于ArrayDeque
ArrayDeque和LinkedList是Deque的两个通用实现,由于官方更推荐使用AarryDeque用作栈和队列, 从名字可以看出ArrayDeque底层通过数组实现,为了满足可以同时在数组两端插入或删除元素的需求,该数组还必须是循环的,即循环数组(circular array),也就是说数组的任何一点都可能被看作起点或者终点。ArrayDeque是非线程安全的(not thread-safe),当多个线程同时使用的时候,需要程序员手动同步;另外,该容器不允许放入null元素。
import java.util.*;public class ArrayDequeStack {public static void main(String[] args) {ArrayDeque stack = new ArrayDeque();// 依次将三个元素push入“栈”,先进后出stack.push("疯狂Java讲义");stack.push("轻量级Java EE企业应用实战");stack.push("疯狂Android讲义");System.out.println(stack); // [疯狂Android讲义, 轻量级Java EE企业应用实战, 疯狂Java讲义]System.out.println(stack.peek()); // 疯狂Android讲义System.out.println(stack); // [疯狂Android讲义, 轻量级Java EE企业应用实战, 疯狂Java讲义]System.out.println(stack.pop()); // 疯狂Android讲义System.out.println(stack);//[轻量级Java EE企业应用实战, 疯狂Java讲义]// 当做队列来使用,先进先出ArrayDeque queue = new ArrayDeque();queue.offer("疯狂Java讲义");queue.offer("轻量级JavaEE企业应用实践");queue.offer("疯狂Android讲义");System.out.println(queue); //[疯狂Java讲义, 轻量级JavaEE企业应用实践, 疯狂Android讲义]// 访问队列头部元素,但不将其poll出队列System.out.println(queue.peek());System.out.println(queue);// poll出第一个元素System.out.println(queue.poll());System.out.println(queue);// [轻量级JavaEE企业应用实践, 疯狂Android讲义]}}
[疯狂Android讲义, 轻量级Java EE企业应用实战, 疯狂Java讲义]疯狂Android讲义[疯狂Android讲义, 轻量级Java EE企业应用实战, 疯狂Java讲义]疯狂Android讲义[轻量级Java EE企业应用实战, 疯狂Java讲义][疯狂Java讲义, 轻量级JavaEE企业应用实践, 疯狂Android讲义]疯狂Java讲义[疯狂Java讲义, 轻量级JavaEE企业应用实践, 疯狂Android讲义]疯狂Java讲义[轻量级JavaEE企业应用实践, 疯狂Android讲义]
