在之前的文章我们介绍了一下 Java 中的  集合框架中的Collection 的子接口 List,本章我们来看一下 Java 集合框架中的Collection 的子接口 Queue。

在之前我们讲 List 和 Set 的时候可以通过下标的形式获取想要的元素,在 Collection 中其实还有 Queue 这个子接口,就是队列的意思。

队列可以形象的比喻为在火车站排队买票,先进先出,后进后出,接下来我们就用代码来实现一下:

 import java.util.LinkedList;
import java.util.Queue; /**
* java.util.Queue
* 队列
* 队列也可以存放一组元素,但是存取元素必须
* 遵循:先进先出原则
*/ public class Main {
public static void main(String[] args) {
/**
* LinkedList 也实现了队列接口,
* 因为它可以保存一组元素
* 并且首尾增删快,正好符合队列的特点
*/
Queue<String> queue = new LinkedList<String>();
/**
* boolean offer(E e)
* 入队操作,向队尾追加一个新元素
*/
queue.offer("one");
queue.offer("two");
queue.offer("three");
queue.offer("four");
System.out.println(queue.size()); //
System.out.println(queue); // [one, two, three, four] /**
* E peek()
* 引用队首元素,但是不做出队操作
* 返回值是该元素
*/
String peek = queue.peek();
System.out.println(peek); // one
System.out.println(queue); // [one, two, three, four] /**
* E poll()
* 出队操作,从队首获取元素,获取后该元素
* 就从队列中被删除
* 返回值是该元素
*/
String old = queue.poll();
System.out.println(old); // one
System.out.println(queue); // [two, three, four] /**
* 循环获取每个元素
* 不能通过 i++ 的形式,因为每次取出一个后 size 会有变化
*/
for (int i = queue.size(); i > 0; i--) {
System.out.println(queue.poll()); // two three four
}
// 用 while 更好点
while (queue.size() > 0) {
System.out.println(queue.poll()); // two three four
}
}
}

队列在编程中一般不会用到,除非有特殊规定需要先后顺序的时候采用,例如在玩游戏服务器爆满要排队进入游戏的时候,当然得排除会员插队现象。

下面我们再来看一下另一个概念:栈

栈:存储医嘱元素,但是存取元素必须遵循先进后出的原则,通常为了实现后退这类功能会使用栈。

在现实生活中子弹上膛打出就是一个很经典的栈。

在上图中是队列的一些方法,如果我们把右边的方法去掉不用,仅左边的方法就是一个栈,先进后出。

在栈中还有自己的方法 push 和 pop,具体操作如下:

 import java.util.Deque;
import java.util.LinkedList; public class Main {
public static void main(String[] args) {
/**
* Java.util.Deque
* 双端队列,两端都可以进出队
* 当调用从一端进出队列操作时,就形成了栈接口
* 因此,双端队列为栈提供了两个方法
* push,pop
*/
Deque<String> stack = new LinkedList<String>();
stack.push("one");
stack.push("two");
stack.push("three");
stack.push("four");
System.out.println(stack.size()); //
System.out.println(stack); // [four, three, two, one] /**
* 获取第一个元素
*/
String peek = stack.peek();
System.out.println(peek); // four
System.out.println(stack); // [four, three, two, one] /**
* 出栈操作
*/
String old = stack.pop();
System.out.println(old); // four
System.out.println(stack); // [three, two, one] /**
* 循环出栈
*/
while (stack.size() > 0) {
System.out.println(stack.pop()); // three two one
}
}
}

队列和栈的区别在于一个先进先出,一个先进后出,很多方法都是通用的,需要自己在实际开发应用中使用。