乐趣区

关于java:精解四大集合框架Queue核心知识总结

关注Java 后端技术全栈”**

回复“面试”获取全套面试材料

Queue 用于模仿队列这种数据结构,队列通常是指“先进先出”(FIFO=first in first out)的容器。新元素插入(offer)到队列的尾部,拜访元素(poll)操作会返回队列头部的元素。通常,队列不容许随机拜访队列中的元素。

这种构造就相当于咱们排队上车,先到的站在后面,先上车,后到的得等后面先上车了再上车。

排队进地铁站

排队打饭

排队买火车票

排队买货色

排队办理银行业务

排队…..

有点中国优良传统的美德的意思。扯远了!!!

Java 中的 Queue 的实现有三种形式:

  • 阻塞队列
  • 非阻塞队列
  • 双向队列

Queue 跟 List、Set 一样,也是继承了 Collection 接口。既然生存中的“排队”都那么多,所以 Queu 的应用场景也是十分多的,很典型的 JDK 自带的线程池中就大量应用了 Queue 来存储工作。

类图 UML

下面只是大抵列了这几个场景的。

阻塞队列

阻塞队列是一个能够阻塞的先进先出汇合,比方某个线程在空队列获取元素时、或者在已存满队列存储元素时,都会被阻塞。

说白了就是干等着,啥也干不了。排队上车的时候,你就只能始终站在在那里排队,你要是想去上厕所回来你的地位都不见了,还得从新排队。

BlockingQueue 接口罕用的实现类如下:

  • ArrayBlockingQueue:基于数组的有界阻塞队列,必须指定大小。
  • LinkedBlockingQueue:基于单链表的无界阻塞队列,不需指定大小。
  • PriorityBlockingQueue:基于最小二叉堆的无界、优先级阻塞队列。
  • DelayQueue:基于提早、优先级、无界阻塞队列。
  • SynchronousQueue:基于 CAS 的阻塞队列。

罕用办法:

  • add():新增一个元索,如果队列已满,则抛异样。
  • offer():新增一个元素,如果队列没满则返回 true,如果队列已满,则返回 false。
  • put():新增一个元素,如果队列满,则阻塞。
  • element():获取队列头部一个元素,如果队列为空,则抛异样。
  • peek():获取队列头部一个元素,如果队列为空,则返回 null。
  • remove():执行删除操作,返回队列头部的元素,如果队列为空,则抛异样。
  • poll():执行删除操作,返回队列头部的元素,如果队列为空,则返回 null。
  • take():执行删除操作,返回队列头部的元素,如果队列为空,则阻塞。

非阻塞队列

非阻塞队列是应用 CAS(compare and set) 机制实现,相似 volatile,并发性能好。

人太多了,很多当初开始风行取号,先取个号,看着离我这号太远了,我进来溜达溜达一下再来。

罕用的阻塞队列有 PriorityQueue 和 ConcurrentLinkedQueue。

  • PriorityQueue:基于优先级的无界优先级队列
  • ConcurrentLinkedDeque:基于双向链表构造的无界并发队列。

双端队列(Deque)

Deque 是一个既能够在头部操作元素,又能够为尾部操作元素,俗称为双向(双端)队列。Deque 继承自 Queue,Deque 实现类有 LinkedList、ArrayDeque、ConcurrentLinkedDeque 等等。在将 List 篇的时候,外面就说 LinkedList 是一种双向队列,其实它也是 Deque 的一种实现形式。

(⊙o⊙)…额…难堪了,双向队列生存场景没想进去,留言区谁能帮我补充一下吗?蟹蟹

罕用双向对垒的实现类有:

  • LinkedList:基于单链表的无界双端队列,容许元素为 null。
  • ArrayDeque:基于数组的有界双端队列,不容许 null。不是线程平安的。当作为栈应用时,性能比 Stack 好;当作为队列应用时,性能比 LinkedList 好。

本来打算写具体点,然而发现,一旦写具体了,便又是长篇长篇的了。还是慢慢来,步子迈大了还是有点疼。

退出移动版