JAVA中的队列(Queue)详解

 更新时间:2023年07月25日 08:49:32   作者:java叶新东老师  
这篇文章主要介绍了JAVA中的队列(Queue)详解,队列是一种特殊的线性表,遵循先入先出、后入后出的基本原则,一般来说,它只允许在表的前端进行删除操作,需要的朋友可以参考下

什么是队列?

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

java队列特性

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

阻塞和非阻塞

阻塞队列

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

出列(删除元素)时,如果队列为空的情况下,也会进行等待(阻塞),待队列有值的时候即会解除阻塞状态,进而继续出列;

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

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

非阻塞队列

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

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

出列时,如果队列为空,则取出空值;

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

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

有界和无界

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

无界:无限大小,其实说是无限大小,其实是有界限的,只不过超过界限时就会进行扩容,就行ArrayList 一样,在内部动态扩容

单向链表和双向链表

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

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

java 队列接口继承图

队列常用方法

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

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

非阻塞队列

1、ConcurrentLinkedQueue

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

2、ConcurrentLinkedDeque

双向链表结构的无界并发队列, 非阻塞队列,由CAS实现线程安全

3、PriorityQueue

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

阻塞队列

1、DelayQueue

一个支持延时获取元素的无界阻塞队列

2、LinkedTransferQueue

一个由链表结构组成的无界阻塞队列。

3、ArrayBlockingQueue

有界队列,阻塞式,初始化时必须指定队列大小,且不可改变;,底层由数组实现;

4、SynchronousQueue

最多只能存储一个元素,每一个put操作必须等待一个take操作,否则不能继续添加元素

5、PriorityBlockingQueue

一个带优先级的队列,而不是先进先出队列。元素按优先级顺序被移除,而且它也是无界的,也就是没有容量上限,虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会导致 OutOfMemoryError 错误;

到此这篇关于JAVA中的队列(Queue)详解的文章就介绍到这了,更多相关JAVA的队列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java SpringBoot整合JSP和MyBatis

    Java SpringBoot整合JSP和MyBatis

    这篇文章主要介绍了SpringBoot如何整合JSP和MyBatis以及SpringBoot的基本设置,感兴趣的小伙伴可以参考阅读
    2023-03-03
  • Java连接SqlServer错误的完美解决方法

    Java连接SqlServer错误的完美解决方法

    我们在做Java或者C#连接数据库的时候,常常遇到连接SqlServer失败的问题,明明检查了好几遍代码没问题了,还是连接不上,下面这篇文章主要给大家介绍了关于Java连接SqlServer错误的完美解决方法,需要的朋友可以参考下
    2023-04-04
  • Java的引用类型常用的四种方法

    Java的引用类型常用的四种方法

    这篇文章主要介绍了Java的引用类型常用的几种方法,Java为引用类型专门定义了一个类Reference,它是引用对象的抽象基类,相关内容需要的小伙伴可以参考一下
    2022-06-06
  • springboot实现执行sql语句打印到控制台

    springboot实现执行sql语句打印到控制台

    这篇文章主要介绍了springboot实现执行sql语句打印到控制台的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • JavaWeb文件上传入门教程

    JavaWeb文件上传入门教程

    这篇文章主要为大家详细介绍了JavaWeb文件上传入门教程,分析了文件上传原理、介绍了第三方上传组件,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • 手写java性能测试框架第二版

    手写java性能测试框架第二版

    这篇文章主要为大家介绍了手写java性能测试框架第二版实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • IDEA创建Servlet编写HelloWorldServlet页面详细教程(图文并茂)

    IDEA创建Servlet编写HelloWorldServlet页面详细教程(图文并茂)

    在学习servlet过程中参考的教程是用eclipse完成的,而我在练习的过程中是使用IDEA的,在创建servlet程序时遇到了挺多困难,在此记录一下,这篇文章主要给大家介绍了关于IDEA创建Servlet编写HelloWorldServlet页面详细教程的相关资料,需要的朋友可以参考下
    2023-10-10
  • JSON 格式的弊端与解决方法(真实示例)

    JSON 格式的弊端与解决方法(真实示例)

    JSON 格式是目前最流行的数据交互格式,广泛应用于前后端分离的系统。但也有一些场合不适合使用 JSON 格式,这篇文章主要介绍了JSON 格式的弊端与解决方法,需要的朋友可以参考下
    2022-09-09
  • IDEA如何开启并配置services窗口

    IDEA如何开启并配置services窗口

    在使用IntelliJ IDEA时,可能会遇到Services窗口不自动弹出的情况,本文介绍了如何手动开启Services窗口的简单步骤,首先,通过点击菜单栏中的“视图”->“工具窗口”->“服务”,或使用快捷键Alt+F8(注意快捷键可能存在冲突)来打开Services窗口
    2024-10-10
  • Spring Boot和Vue前后端分离项目架构的全过程

    Spring Boot和Vue前后端分离项目架构的全过程

    前后端分离是目前互联网开发中比较广泛使用的开发模式,主要是将前端和后端的项目业务进行分离,下面这篇文章主要给大家介绍了关于Spring Boot和Vue前后端分离项目架构的相关资料,需要的朋友可以参考下
    2022-04-04

最新评论