Java-数据结构-队列

集合体系图

在这里插入图片描述
在这里插入图片描述
队列属于集合体系,实现Collection,与List、Set属于同一级别。

队列的数据结构特点

队列是一种特殊的线性表,特点是FIFO(先入先出),只允许从表的前端进行删除操作,只允许从表的后端进行添加操作

队列的基本类型

  1. 双端队列Dequeue
    双端队列

  2. 阻塞队列BlockingQueue
    java.util.concurrent 加入了 BlockingQueue和五个阻塞队列类,它是一种变形的FIFO结构,不是立即从队列的头部或尾部执行删除和加入操作,是对线程进行了操作阻塞,指导有元素进行删除或插入,五个阻塞实现类如下:

    ArrayBlockingQueue:由数组支持的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序,容量需要在构造时指定,也可以设置公平性,其实就是通过设置ReentrantLock为true来达到公平性,即优先分配给等待时间长的线程,打开公平性自然也就牺牲了效率,可以衡量使用。
    
    LinkedBlockingQueue:由链表支持的有界阻塞队列,此队列按 FIFO(先进先出)排序元素,容量是没有上限的(说的不准确,在不指定时容量为Integer.MAX_VALUE,不要然的话在put时怎么会受阻呢),但是也可以选择指定其最大容量。
    
    PriorityBlockingQueue:由优先级支持的无界优先级队列,而不是先进先出的,PriorityBlockingQueue是对 PriorityQueue的再次包装,是基于堆数据结构的,而PriorityQueue是没有容量限制的,与ArrayList一样,所以在优先阻塞 队列上put时是不会受阻的。虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会导致 OutOfMemoryError,但是如果队列为空,那么取元素的操作take就会阻塞,所以它的检索操作take是受阻的。另外,往入该队列中的元 素要具有比较能力。
    
    DelayQueue :由优先级堆支持的基于时间调度的队列,基于PriorityQueue来实现的,是一个存放Delayed 元素的无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且poll将返回null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于或等于零的值时,则出现期满,poll就以移除这个元素了。此队列不允许使用 null 元素。
    
    SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制
    
  3. 非阻塞队列AbstractQuue

    PriorityQueue :类实质上维护了一个有序列表。加入到 Queue 中的元素根据它们的天然排序(通过其 java.util.Comparable 实现)或者根据传递给构造函数的 java.util.Comparator 实现来定位。
    
    ConcurrentLinkedQueue:
     是基于链接节点的、线程安全的队列,并发访问不需要同步。
     因为它在队列的尾部添加元素并从头部删除它们,
     所以只要不需要知道队列的大小,
     ConcurrentLinkedQueue 对公共集合的共享访问就可以工作得很好。
     收集关于队列大小的信息会很慢,需要遍历队列。
    

队列操作方法

下表显示了jdk1.5中的阻塞队列的操作:

add : 增加一个元素   如果队列已满,则抛出一IIIegaISlabEepeplian异常

remove:移除并返回队列头部的元素  如果队列为空则抛出一个NoSuchElementException异常

element:返回队列头部的元素  如果队列为空则抛出一个NoSuchElementException异常

offer:添加一个元素并返回true       如果队列已满,则返回false

poll:移除并返问队列头部的元素    如果队列为空,则返回null

peek:返回队列头部的元素             如果队列为空,则返回null

put:添加一个元素                      如果队列满,则阻塞

take:移除并返回队列头部的元素     如果队列为空,则阻塞

remove、element、offer 、poll、peek 其实是属于Queue接口。

阻塞队列的操作可以根据它们的响应方式分为以下三类:
aad、removee和element操作在你试图为一个已满的队列增加元素或从空队列取得元素时 抛出异常。当然,在多线程程序中,队列在任何时间都可能变成满的或空的,所以你可能想使用offer、poll、peek方法。这些方法在无法完成任务时 只是给出一个出错示而不会抛出异常。

注意:poll和peek方法出错进返回null。因此,向队列中插入null值是不合法的

最后,我们有阻塞操作put和take。put方法在队列满时阻塞,take方法在队列空时阻塞。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值