Java里有一个叫做Stack的类,却没有叫做Queue的类(它是个接口名字)。当需要使用栈时,Java已不推荐使用Stack,而是推荐使用更高效的ArrayDeque;

既然Queue只是一个接口,当需要使用队列时也就首选ArrayDeque了(次选是LinkedList)。

队列常用方法

初始化

  1. import java.util.LinkedList;
  2. import java.util.Queue;
  3. 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元素。

  1. import java.util.*;
  2. public class ArrayDequeStack {
  3. public static void main(String[] args) {
  4. ArrayDeque stack = new ArrayDeque();
  5. // 依次将三个元素push入“栈”,先进后出
  6. stack.push("疯狂Java讲义");
  7. stack.push("轻量级Java EE企业应用实战");
  8. stack.push("疯狂Android讲义");
  9. System.out.println(stack); // [疯狂Android讲义, 轻量级Java EE企业应用实战, 疯狂Java讲义]
  10. System.out.println(stack.peek()); // 疯狂Android讲义
  11. System.out.println(stack); // [疯狂Android讲义, 轻量级Java EE企业应用实战, 疯狂Java讲义]
  12. System.out.println(stack.pop()); // 疯狂Android讲义
  13. System.out.println(stack);//[轻量级Java EE企业应用实战, 疯狂Java讲义]
  14. // 当做队列来使用,先进先出
  15. ArrayDeque queue = new ArrayDeque();
  16. queue.offer("疯狂Java讲义");
  17. queue.offer("轻量级JavaEE企业应用实践");
  18. queue.offer("疯狂Android讲义");
  19. System.out.println(queue); //[疯狂Java讲义, 轻量级JavaEE企业应用实践, 疯狂Android讲义]
  20. // 访问队列头部元素,但不将其poll出队列
  21. System.out.println(queue.peek());
  22. System.out.println(queue);
  23. // poll出第一个元素
  24. System.out.println(queue.poll());
  25. System.out.println(queue);// [轻量级JavaEE企业应用实践, 疯狂Android讲义]
  26. }
  27. }
  1. [疯狂Android讲义, 轻量级Java EE企业应用实战, 疯狂Java讲义]
  2. 疯狂Android讲义
  3. [疯狂Android讲义, 轻量级Java EE企业应用实战, 疯狂Java讲义]
  4. 疯狂Android讲义
  5. [轻量级Java EE企业应用实战, 疯狂Java讲义]
  6. [疯狂Java讲义, 轻量级JavaEE企业应用实践, 疯狂Android讲义]
  7. 疯狂Java讲义
  8. [疯狂Java讲义, 轻量级JavaEE企业应用实践, 疯狂Android讲义]
  9. 疯狂Java讲义
  10. [轻量级JavaEE企业应用实践, 疯狂Android讲义]

例子参考:https://www.cnblogs.com/jiqing9006/p/6107491.html