什么是队列?队列是一种特殊的线性表,它遵循先进先出和后进后出的基本原则。一般来说,它只允许在表的前端删除,而在表的后端插入。但是java中的一些队列运行到任何地
什么是队列?
队列是一种特殊的线性表,它遵循先进先出和后进后出的基本原则。一般来说,它只允许在表的前端删除,而在表的后端插入。但是java中的一些队列运行到任何地方都可以插入和删除;比如我们常用的LinkedList集合实现了Queue接口,所以可以理解为LinkedList是一个队列;
Java队列特性
队列主要分为阻塞和非阻塞、有界和无界、单向链表和双向链表。
阻塞和非阻塞。
阻塞队列
进入队列(删除元素)时,如果元素数量超过队列总数,则等待(阻塞)。队列中的元素出队后,当元素个数不超过队列总数时,解除阻塞状态,然后继续排队。
出列(添加元素)时,如果队列是空,也会等待(阻塞)。当队列中有值时,阻塞状态将被释放,然后继续出队。
阻塞队列的好处是可以防止队列容器溢出;只要满了,就堵,就等;没有溢出;
只要它阻塞队列,它就是线程安全的;
非阻塞队列
无论它是出列还是入队,都不会被阻塞,
在进入列时,如果元素的数量超过了队列的总数,就会抛出异常。
出列时,如果队列为空,则取出空值;
一般情况下,很少使用非阻塞队列,常用阻塞对象较多;阻塞队列和非阻塞队列的最大区别在于阻塞队列提供以下两种方法:
队列阻塞方法:take()
队列阻塞方法:put()
有界和无界
有界的:有界的,尺寸和长度有限的。
无界:无限大小,实际上是无限大小,实际上是有界的,但是当它超出边界的时候,就会被扩展,就像ArrayList一样,在内部动态扩展。
单向链表和双向链表
单向链表:除了元素本身,每个元素都存储一个指针,指针指向下一个元素;
双向链表:除了元素本身,还有两个指针,一个指向上一个元素的地址,另一个指向下一个元素的地址;
java 队列接口继承图
常见队列方法
添加一个元行。如果队列已满,抛出IIIegaISlabEepeplian异常。
移除并返回队列头部的元素。如果队列是空,抛出NoSuchElementException异常。
返回队列头部的元素。如果队列是空,将抛出NoSuchElementException异常。
Offer添加一个元素,如果队列已满,则返回true或false。
Poll移除并收回队列头部的元素。如果队列是空,则返回null。
Peek返回队列头部的元素。如果队列是空,则返回null。
Put添加一个元素。如果队列已满,它将阻塞。
Take移除并返回队列头部的元素。如果队列是空,就会阻塞。
DrainTo(list)一次获取队列中的所有元素。
知识点:remove、element、offer、poll、peek其实都属于队列接口。
非阻塞队列
1、并发链接队列
单向链表结构的无界并发队列,非阻塞队列,CAS实现的线程安全,内部基于节点的实现。
2、并发链接请求
双向链表结构的无界并发队列,非阻塞队列,CAS实现的线程安全。
3、优先级队列
基于内部数组实现,线程不安全队列
阻塞队列
1、延迟队列
支持元素延迟获取的无界阻塞队列
2、链接传输队列
一种由链表结构组成的无界阻塞队列。
3、数组阻塞队列
有界队列,阻塞型,队列大小必须在初始化时指定,不能更改;,底层用数组实现;
4、同步队列
最多只能存储一个元素,每个put操作必须等待一个take操作,否则无法继续添加元素。
5、优先级阻塞队列
有优先级的队列,而不是先入先出队列。元素按优先级顺序删除,并且是无界的,即没有容量上限。尽管该队列在逻辑上是无限的,但尝试执行添加操作可能会导致OutOfMemoryError,因为资源已经耗尽。
私信666接收信息
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。
作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/142871.html