java队列详解

什么是队列

队列是一种特殊的线性表,.遵循陷入先出,后入后出的基本原则,一般来说,它只允许在表的前端进行删除操作,而在表的后端进行插入操作,但是在java某些队列可以在任何地方插入删除,比如我们常用的linkedList,它也实现了queue阶级,因此,可以理解为它就是一个队列

java队列特性

队列主要分为阻塞和非阻塞,有界无界,单向和双向之分

阻塞和非阻塞

阻塞队列

如果元素数量超过队列总数,会进行等待(阻塞),等待队列中的元素出列后,元素数量未超过队列总数时,就会解除阻塞状态,进而可以继续进入列

出列(删除元素)时,如果元素数量超过队列总数,会进行等待(阻塞),等待队列中有值的时候即会解除阻塞状态,进而继续出列

阻塞队列好处是可以防止队列容器溢出,只要满了就会进行等待;也就不存在溢出的情况

只要是阻塞队列都是线程安全的

非阻塞队列

不管出列还是入列都不会进行阻塞

入列时,如果元素超过队列总数,则会抛出异常

出列时,如果队列为空,则去出空值

一般情况下,非阻塞式队列使用的比较少,一般都用阻塞式的对象比较多;阻塞和非阻塞队列在使用上的最大区别就是阻塞队列提供了以下2个方法:

  • 出队阻塞方法 : take()
  • 入队阻塞方法 : put()

有界和无界

有界:有界限,大小长度受限制
无界:无限大小

单向链表和双向链表

单向链表 : 每个元素中除了元素本身之外,还存储一个指针,这个指针指向下一个元素;

双向链表 :除了元素本身之外,还有两个指针,一个指针指向前一个元素的地址,另一个指针指向后一个元素的地址;

队列常用方法

  add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
  remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
  element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
  offer 添加一个元素并返回true 如果队列已满,则返回false
  poll 移除并返问队列头部的元素 如果队列为空,则返回null
  peek 返回队列头部的元素 如果队列为空,则返回null
  put 添加一个元素 如果队列满,则阻塞
  take 移除并返回队列头部的元素 如果队列为空,则阻塞

   drainTo(list)   一次性取出队列所有元素

知识点: remove、element、offer 、poll、peek 其实是属于Queue接口。

具体的类

非阻塞队列

ConcurrentLinkedQueue:单项列表结构的无界并发队列,非阻塞队列,由CAS实现线程安全,内部基于节点实现

ConcurrentLinkedDeque:双向列表结构的无界并发队列,由CAS实现线程安全

priorityQueue:内部基于数组实现,线程不安全的队列

阻塞队列

全都集成自blockingQueue

ArrayBlockingQueue : 一个由数组结构组成的有界阻塞队列。
LinkedBlockingQueue : 一个由链表结构组成的可选是否有界阻塞队列。
PriorityBlockingQueue : 一个支持优先级排序的无界阻塞队列。
DelayQueue: 一个使用优先级队列实现的无界阻塞队列。
SynchronousQueue: 一个不存储元素的阻塞队列。
LinkedTransferQueue: 一个由链表结构组成的无界阻塞队列。
LinkedBlockingDeque: 一个由链表结构组成的双向阻塞队列。

Last modification:January 7, 2023
如果觉得我的文章对你有用,请随意赞赏