首页 > 编程语言 >Java中Queue的实现方式有哪些?

Java中Queue的实现方式有哪些?

时间:2023-07-10 15:32:34浏览次数:37  
标签:排队 Java 哪些 队列 元素 阻塞 Queue 假如

一、队列的概念

Queue用于模拟队列这种数据结构,队列通常是指“先进先出”(FIFO=first in first out)的容器。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。

这种结构就相当于我们排队上车,先到的站在前面,先上车,后到的得等前面先上车了再上车。

排队进地铁站,排队打饭,排队买火车票,排队买东西,排队办理银行业务,排队…..


二、Java中的Queue的实现有三种方式

阻塞队列

非阻塞队列

双向队列

Queue 跟 List、Set 一样,也是继承了 Collection 接口。既然生活中的“排队”都那么多,所以Queue的使用场景也是非常多的,很典型的JDK自带的线程池中就大量使用了Queue来存储任务。

阻塞队列

阻塞队列是一个可以阻塞的先进先出集合,比如某个线程在空队列获取元素时、或者在已存满队列存储元素时,都会被阻塞。

说白了就是干等着,啥也干不了。排队上车的时候,你就只能一直站在在那里排队,你要是想去上厕所回来你的位置都不见了,还得重新排队。

BlockingQueue 接口常用的实现类如下:

ArrayBlockingQueue :基于数组的有界阻塞队列,必须指定大小。

LinkedBlockingQueue :基于单链表的无界阻塞队列,不需指定大小。

PriorityBlockingQueue :基于最小二叉堆的无界、优先级阻塞队列。

DelayQueue:基于延迟、优先级、无界阻塞队列。

SynchronousQueue :基于 CAS 的阻塞队列。

常用方法:

add():新增一个元索,假如队列已满,则抛异常。

offer():新增一个元素,假如队列没满则返回 true,假如队列已满,则返回 false。

put():新增一个元素,假如队列满,则阻塞。

element():获取队列头部一个元素,假如队列为空,则抛异常。

peek():获取队列头部一个元素,假如队列为空,则返回 null。

remove():执行删除操作,返回队列头部的元素,假如队列为空,则抛异常。

poll():执行删除操作,返回队列头部的元素,假如队列为空,则返回 null。

take():执行删除操作,返回队列头部的元素,假如队列为空,则阻塞。

非阻塞队列

非阻塞队列是使用CAS(compare and set)机制实现,类似 volatile,并发性能好。

人太多了,很多现在开始流行取号,先取个号,看着离我这号太远了,我出去溜达溜达一下再来。

常用的阻塞队列有 PriorityQueue 和 ConcurrentLinkedQueue。

PriorityQueue :基于优先级的无界优先级队列

ConcurrentLinkedDeque:基于双向链表结构的无界并发队列。

双端队列(Deque)

Deque 是一个既可以在头部操作元素,又可以为尾部操作元素,俗称为双向(双端)队列。Deque 继承自 Queue,Deque 实现类有 LinkedList、 ArrayDeque、ConcurrentLinkedDeque 等等。在将List篇的时候,里面就说LinkedList是一种双向队列,其实它也是Deque的一种实现方式。

常用双向对垒的实现类有:

LinkedList:基于单链表的无界双端队列,允许元素为 null。

ArrayDeque:基于数组的有界双端队列,不允许 null。不是线程安全的。当作为栈使用时,性能比Stack好;当作为队列使用时,性能比LinkedList好。


标签:排队,Java,哪些,队列,元素,阻塞,Queue,假如
From: https://blog.51cto.com/u_15168824/6677372

相关文章

  • java级联调用的空指针问题
    Java中的空指针异常(NullPointerException)通常是由于在一个对象引用上调用了空引用的方法或访问了空引用上的实例变量而引起的。当你尝试使用一个空引用时,就会抛出空指针异常。一个常见的情况是在级联调用中出现空指针异常。级联调用是指对一个对象的多个方法调用进行链式操作。例如......
  • java客户端连接zookeeper
    一、使用官方的maven依赖:<dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.10</version></dependency>代码:Z......
  • Java实现浏览器端大文件分片上传源代码
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。这次项目的需求:支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,ie8,ie9,Chrome,Firefox,360安全浏览器,并且刷新浏览器后仍然能够续传,重启浏览器(关闭......
  • 运行 Spring6 报错 Internal error: (java.lang.ExceptionInInitializerError)
    问题描述:使用2019.3.5版本的IDEA构建Spring6项目。因为Spring6要求JDK的版本最低是Java17,我就直接在2019.3.5版本的IDEA中创建新的项目时使用了JDK17。 运行项目时IDEA 出现如下报错信息:Error:Internalerror:(java.lang.ExceptionInInitializerErro......
  • ionic cordova 打包Rlease版本包出现异常Execution failed for task ':app:mergeRelea
    异常: 解决方法:找到android=》app下的build.gradle文件,如下增加如下配置 运行ioniccordovabuildandroid--release打包语句正常执行 ......
  • java List去重的代码
    一、HashSet去重我们知道 HashSet 天生具备“去重”的特性,那我们只需要将List集合转换成HashSet集合就可以了,实现代码如下:publicclassListDistinctExample{publicstaticvoidmain(String[]args){List<Integer>list=newArrayList<Integer>(){{......
  • 互联网医院系统|互联网医院源码开发|线上医疗功能有哪些?
    互联网医院系统通过线上诊疗,让医生与患者之间的距离消失,实现了时间空间的无障碍交流。患者可以随时随地进行在线咨询,医生根据实时数据做出科学判断,为患者提供个性化的指导和治疗方案。这不仅大大提高了患者就医的效率,更为那些居住在偏远地区的患者解决了求医难的问题。互联网医院系......
  • 聊一聊Java中的Steam流
    1引言在我们的日常编程任务中,对于集合的制造和处理是必不可少的。当我们需要对于集合进行分组或查找的操作时,需要用迭代器对于集合进行操作,而当我们需要处理的数据量很大的时候,为了提高性能,就需要使用到并行处理,这样的处理方式是很复杂的。流可以帮助开发者节约宝贵的时间,让以上......
  • Java实现浏览器端大文件分片上传插件
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。首先我们需要了解的是上传文件三要素:1.表单提交方式:post(get方式提交有大小限制,post没有)2.表单的enctype属性:必须设置为multipart/form-data.3.表单必须......
  • Java 基础知识
    Java基础知识1.Java语言有哪些特点简单易学、有丰富的类库面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高)与平台无关性(JVM是Java跨平台的根本)可靠安全支持多线程2.面向对象和面向过程的区别面向过程:是分析解决问题的步骤,然后用按说......