Skip to main content

Java队列

1. 队列(Queue)

队列(Queue)是一种经常使用的集合。Queue实际上是实现了一个先进先出(FIFO:First In First Out)的有序表。它和List的区别在于,List可以在任意位置添加和删除元素,而Queue只有两个操作:

  1. 把元素添加到队列尾部
  2. 把队列头部元素取出来

在Java中操作的方法:

操作类型抛出Exception返回特殊值
插入元素add(e)offer(e)
删除元素remove()poll()
检查元素element()peek()

2. 双向队列(Deque)

一个线性 collection,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写。顾名思义支持双向元素操作:

操作类型抛出Exception(头部)返回特殊值(头部)抛出Exception(尾部)返回特殊值(尾部)
插入元素push(e)/addFirst(e)offerFirst(e)add(e)/addLast(e)offer(e)/offerLast(e)
删除元素remove()/removeFirst()/pop()poll()/pollFirst()removeLast()pollLast()
检查元素element()/elementFirst()peek()/peekFirst()elementLast()peekLast()

3. 优先队列(PriorityQueue)

PriorityQueue实现了一个优先队列:从队首获取元素时,总是获取优先级最高的元素。PriorityQueue默认按元素比较的顺序排序(必须实现Comparable接口),也可以通过Comparator自定义排序算法(元素就不必实现Comparable接口)

4. 阻塞队列(BlockingQueue)

操作类型抛出Exception返回特殊值阻塞超时
插入元素add(e)offer(e)put(e)offer(e, time, unit)
删除元素remove()poll()take()poll(time, unit)
检查元素element()peek()

5. 阻塞队列的实现

阻塞队列实现分为两大类,有界队列和无界队列:

队列名称底层数据结构是否有界备注
ArrayBlockingQueue数组有界队列初始化需要制定队列的大小
LinkedBlockingQueue链表有界队列默认最大值Integer.MAX_VALUE
PriorityBlockingQueue数组有界队列默认大小为11,最大值Integer.MAX_VALUE - 8
DelayQueue数组无界队列支持延时
SynchronousQueue数组不存储元素同步的:一个offer必须与一个take与之相对应。负责存放不了元素
LinkedTransferQueue链表无界队列链表的无界阻塞队列
LinkedBlockingDeque链表无界队列双端阻塞队列

我是蚂蚁背大象,文章对你有帮助点赞关注我,文章有不正确的地方请您斧正留言评论~谢谢