# 集合-Queue
🐴
# 前言
Queue队列是一种常见的集合,实现了先进先出(FIFO:First In First Out) 的有序表。他得操作只有两个:
- 尾部添加
- 头部取出
在java中Queue继承自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。
参考文献
← 集合-Map Java-Iterator →