Queue用于模拟队列这种数据结构,队列通常是指“先进先出”(FIFO=first in first out)地容器。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。
这种结构就相当于我们排队上车,先到地站在前面,先上车,后到的得等前面先上车了再上车。
排队进地铁站
排队打饭
排队买火车票
排队买东西
排队办理银行业务
排队…..
有点中国优良传统的美德的意思。扯远了!!!
Java中的Queue的实现有三种方式:
Queue 跟 List、Set 一样,也是继承了 Collection 接口。既然生活中的“排队”都那么多,所以Queu的使用场景也是非常多的,很典型的JDK自带的线程池中就大量使用了Queue来存储任务。
类图UML
上面只是大致列了这几个场景的。
阻塞队列
阻塞队列是一个可以阻塞的先进先出集合,比如某个线程在空队列获取元素时、或者在已存满队列存储元素时,都会被阻塞。
说白了就是干等着,啥也干不了。排队上车的时候,你就只能一直站在在那里排队,你要是想去上厕所回来你的位置都不见了,还得重新排队。
BlockingQueue 接口常用的实现类如下:
常用方法:
非阻塞队列
非阻塞队列是使用CAS(compare and set)机制实现,类似 volatile,并发性能好。
人太多了,很多现在开始流行取号,先取个号,看着离我这号太远了,我出去溜达溜达一下再来。
常用的阻塞队列有 PriorityQueue 和 ConcurrentLinkedQueue。
双端队列(Deque)
Deque 是一个既可以在头部操作元素,又可以为尾部操作元素,俗称为双向(双端)队列。Deque 继承自 Queue,Deque 实现类有 LinkedList、 ArrayDeque、ConcurrentLinkedDeque 等等。在将List篇的时候,里面就说LinkedList是一种双向队列,其实它也是Deque的一种实现方式。
(⊙o⊙)…额…尴尬了,双向队列生活场景没想出来,留言区谁能帮我补充一下吗?蟹蟹
常用双向对垒的实现类有:
原本打算写详细点,但是发现,一旦写详细了,便又是长篇长篇的了。还是慢慢来,步子迈大了还是有点疼。
Java后端技术全栈 发起了一个读者讨论 大家有什么不错的 双向队列的生活场景吗?
推荐阅读
面试官:什么是字节码?它最大的优势是什么?
【原创】Spring Boot终极篇《下》
【原创】Spring Boot终极篇《上》
本文到此结束,希望对大家有所帮助呢。