# 集合-Queue

🐴

# 前言

Queue队列是一种常见的集合,实现了先进先出(FIFOFirst In First Out) 的有序表。他得操作只有两个:

  • 尾部添加
  • 头部取出

javaQueue继承自Collection接口,并且Deque, LinkedList, PriorityQueue, BlockingQueue 等类都实现了它。Queue常用来存放等待处理元素的集合,如:缓冲并发访问

下面是Queue的结构图

# 方法

Queue除了继承Collection接口外,还有实现了一下自己的方法,常见的方法如下:

方法 描述
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
offer 添加一个元素并返回true 如果队列已满,则返回false
put 添加一个元素 如果队列满,则阻塞
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常·
poll 移除并返问队列头部的元素 如果队列为空,则返回null
take 移除并返回队列头部的元素 如果队列为空,则阻塞
peek 返回队列头部的元素 如果队列为空,则返回null

# Queue实现类

# PriorityQueue

PriorityQueue是非线程安全类,PriorityQueue保存队列元素的顺序不是按照元素添加的顺序来保存的,而是在添加元素的时候对元素的大小排序后再保存的。因此在PriorityQueue中使用peek()pool()取出队列中头部的元素,取出的不是最先添加的元素,而是最小的元素。

PriorityQueue中不允许拆入null元素,并且PriorityQueue有两种排列方式:

  • 自然排序: 采用自然排序的PriorityQueue集合中的元素必须实现Comparator接口,而且应该是一个类的多个实例,否则可能导致ClassCastException异常。
  • 定制排序: 创建PriorityQueue队列时,传入一个Comparable对象,该对象负责对所有队列中的所有元素进行排序。采用定制排序不要求必须实现Comparator接口。
import java.util.NoSuchElementException;
import java.util.PriorityQueue;

public static void main(String[] args){
    PriorityQueue pq = new PriorityQueue();

    for(int i = 0; i<10;i++){
        pq.add(i);
    }

    System.out.println(pq.size()); // 10

    // 移除并返问队列头部的元素 如果队列为空,则返回null
    int first = (int)pq.poll();
    System.out.println(first); // 0
    System.out.println(pq.size()); // 9

    // 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
    try{
        int head = (int)pq.element();
        System.out.println(head); // 1
    }catch (NoSuchElementException e){
        e.printStackTrace();
    }    
}

# PriorityBlockingQueue

PriorityBlockingQueue是线程安全的,其它的和PriorityQueue基本相同。

# ArrayBlockingQueue

ArrayBlockingQueue是一个阻塞的队列,继承了AbstractBlockingQueue,间接的实现了Queue接口和Collection接口。底层以数组的形式保存数据,所以它是基于数组的阻塞队列。ArrayBlockingQueue是有边界值的,在创建ArrayBlockingQueue时就要确定好该队列的大小,一旦创建,该队列大小不可更改。内部的全局锁是使用的ReentrantLock


参考文献

最近更新时间: 7/2/2021, 11:27:27 AM