前言:
当前同学们对“java中队列如何实现”大约比较珍视,兄弟们都想要知道一些“java中队列如何实现”的相关内容。那么小编也在网摘上收集了一些有关“java中队列如何实现””的相关知识,希望你们能喜欢,你们一起来学习一下吧!这里先抛出两个问题:
优先级队列是使用什么数据结构实现的呢?底层的存储用的是数组还是链表?
ArrayBlockingQueue是如何保证并发环境下不出问题的,具体的实现机制是怎样的?
读完本章,你将会有答案;
java中的队列体系
首先看一下java中有哪些与队列相关的类以及它们之间的继承关系时怎么样的。
从上图来看,根元素是:Queue,这个接口定义了队列的基本操作,里面仅仅包含5个方法,如下图所示:
实现这个接口的三个子接口是:BlockingQueue<E>, Deque<E> and BlockingDeque<E>.
其中blockingQueue的主要特点是在队列为空时,出队列操作会阻塞,直到有元素进来;在队列满了之后,入队操作会阻塞,直到有空闲位置。
队列的抽象类:AbstractQueue
队列的实现主要有以下几个类:
LinkedList<E>ArrayDeque<E>PriorityQueue<E>DelayQueue<E extends Delayed>ArrayBlockingQueue<E>LinkedBlockingQueue<E>LinkedBlockingDeque<E>PriorityBlockingQueue<E>ConcurrentLinkedQueue<E>ConcurrentLinkedDeque<E>SynchronousQueue<E>
其中前面三个在util包下面,不支持并发编程,后面的在concurrent包下面,支持并发编程的;
重点说一下delayQueue,这个队列的特点是元素出队列时必须满足一定的时间条件限制。
其余队列特点通过名字很好总结;
队列分析应该关注的点
关于队列的分析,主要应该关注以下两点:
是否有界是否支持并发具体队列源码分析
PriorityQueue:
无边界的,基于堆这种数据结构来实现的,堆的存储方式选用的是数组;
transient Object[] queue; // non-private to simplify nested class access
关于堆这种数据结构将在后面的文章中分析;
ArrayBlockingQueue
并发是如何实现的呢?这里需要注意的是,并不是所有的方法都支持并发,比如add方法,实际上是Collection接口的实现,并不支持并发,offer是Queue接口中的方法实现,也不支持并发;
只有继承自BlockingQueue接口的方法才支持并发编程;
以put为例:
很明显,是通过重入锁ReentrantLock实现的;
技术连载:开篇词
技术连载:连载提纲设计思路
技术连载:数据结构 - 数组
技术连载:数据结构 - 数组常见面试题汇总
技术连载:数据结构 - 链表
技术连载:数据结构 - 链表相关的高频面试题汇总
技术连载:数据结构 - 栈
技术连载:数据结构 - 栈在面试中的应用
技术连载:数据结构 - 队列及其变种(循环、双端、阻塞、并发)
标签: #java中队列如何实现