Java之QueQue队列


简介:

队列是一种先进先出的数据结构。

如果将队列应用在多线程的“生产者与消费者”模型处理中,那么生产者就没有必要等待消费者消费后再生产,可以直接将数据保存在队列之中,而消费者依然必须要等待生产者生产了才能消费。

队列的实现可以使用LinkedList类:

队列的使用主要依靠Queue接口之中提供的方法来处理:

- 向队列之中追加数据:public boolean offer(E e); 可以直接使用add()方法
- 通过队列获取数据:public E poll(); 弹出后删除数据

 代码实现:

import java.util.LinkedList;
import java.util.Queue;

public class MAIN {
    public static void main(String[] args) {
        Queue qq = new LinkedList();
        qq.add("张三");
        qq.add("李四");
        qq.add("王五");
        qq.add("狗蛋");
        qq.offer("黑子");
        System.out.println(qq);
        qq.poll();
        System.out.println(qq);
    }
}

输出结果:

现在观察抛出个数大于队列个数:

import java.util.LinkedList;
import java.util.Queue;

public class MAIN {

    public static void main(String[] args) {
        Queue qq = new LinkedList();
        qq.add("张三");    // 入队
        qq.add("李四");    // 入队
        qq.add("王五");    // 入队
        qq.add("狗蛋");    // 入队
        qq.offer("黑子");    // 入队
        System.out.println(qq);
        qq.poll();    // 出队
        qq.poll();    // 出队
        qq.poll();    // 出队
        qq.poll();    // 出队
        qq.poll();    // 出队
        qq.poll();    // 出队
        System.out.println(qq);
    }

}

输出结果:

会显示空队列,不会出现异常。

除了LinkedList外,还有一个优先级队列概念,可以使用PriorityQueue实现优先级队列:

public class PriorityQueue 
extends AbstractQueue
implements java.io.Serializable

 优先级队列实现:

import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;

public class MAIN {

    public static void main(String[] args) {
        Queue qq = new PriorityQueue();
        qq.add("Z");    // 入队
        qq.add("X");    // 入队
        qq.add("G");    // 入队
        qq.add("S");    // 入队
        qq.add("T");    // 入队
        System.out.println(qq);
        System.out.println(qq.poll());    // 抛出
        System.out.println(qq);
        System.out.println(qq.poll());    // 抛出
        System.out.println(qq);
        System.out.println(qq.poll());    // 抛出
        System.out.println(qq);
        System.out.println(qq.poll());    // 抛出
        System.out.println(qq);
        System.out.println(qq.poll());    // 抛出
    }
}

输出结果:

[G, S, X, Z, T]
G
[S, T, X, Z]
S
[T, Z, X]
T
[X, Z]
X
[Z]
Z

发现PriorityQueue队列存在排序操作。