Java集合:Queue队列解析

最近在在做一些面试题目的时候,发现自己对数据结构的了解不足,只能大概知道如何去用,这对于以后灵活应用他们是不够的。

1.概述
Queue,即队列是继承了CollectionIterable接口的一种队列结构集合。在我们记忆中Queue的最大特点就是它的FIFO方法排列元素,但并不都是这样的,PriorityQueue,优先队列就是一个例外,它是根据元素的值来进行排序的。

2.主要的操作方法
Queue继承了Collection接口,所以Collection的基本操作方法,Queue都有。此外Queue还有一套自己的方法。
Queue的操作方法存在两种形式,第一种是操作失败抛出异常,这个一般是继承Collection的方法;第二种是操作失败,返回false或者null,这个一般是Queue自己的方法。
(1)插入操作

add(E e)
offer(E e)

addoffer方法都可以在队列中插入一个元素。
在Queue中有一种队列叫做有界队列,它的容量是有限的。如果它的元素个数已经等于最大容量了,此时如果进行插入插入操作就会操作失败。如果调用的是add方法,就会抛出IllegalStateException异常,如果调用offer方法,就会返回false,表示操作失败,并不会抛出异常。
此外,Queue不建议将null作为元素添加入队列,如果调用add或者offer方法插入null,就会抛出空指针异常。

(2)删除操作

remove()
poll()

removepoll方法都可以删除并返回队列的头元素。
如果对空队列进行删除操作, 调用remove会抛出NoSuchElementException异常,而poll方法会返回null,表示操作失败。

(3)检索操作

element()
peek()

elementpeek方法都可以返回队列的头元素,并不删除。
与删除操作类似。如果对空队列进行检索操作,调用element方法会抛出NoSuchElementException异常,而peek方法会返回null,表示操作失败。

3.实现类
Queue的实现类主要分成两类:
(1)第一种是通用实现类
主要有两个,一个LinkedList,链表,另一个PriorityQueue,优先队列
LinkedList实现了Deque(双端队列)接口,而Deque是继承了Queue接口,所以LinkedList能当作双端队列使用。
PriorityQueue,是基于栈结构的优先队列,它是根据元素的值或者指定的排序器进行元素排序,并不是FIFO的方法。

(2)第二种是并发实现类
Queue本生没有定义阻塞队列的方法,所以它是线程不安全的,但是它的继承接口BlokingQueue是线程安全的。
它支持在检索元素的时候,等待队列是非空可用,当添加元素的时候,再更改队列的可用状态。主要是通过内部锁或者其他控制并发的方法实现线程安全的效果。
它的实现类主要应用在生产者-消费者队列,由于是线程安全的,所以BlokingQueue可以与多个生产者和多个消费者一起使用。

BlokingQueue的实现都在java.util.concurrent包下,下面是它的一些实现类:

LinkedeBlockingQueue—基于链接节点的可选有界FIFO方式阻塞式队列
ArrayBlockingQueue—基于数组的有界FIFO方式的阻塞式队列
PriorityBlockingQueue—基于栈结构无界阻塞式队列
DelayQueue—基于栈结构的时间调度队列
SychronousQueue—通过使用BlockingQueue接口的简单对接机制的队列

4.后记
自己在学习Queue的时候,除了研究了java1.8的API文档,还有阅读一些优秀的博客文章,多谢他们。
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值