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

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

时间:2023-07-11 14:45:43浏览次数:42  
标签:排队 Java 哪些 队列 元素 阻塞 Queue 假如

一、队列的概念

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

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

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

Queue的实现方式

二、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好。


作者:华清远见成都中心
链接:https://juejin.cn/post/7254006849284030524
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:排队,Java,哪些,队列,元素,阻塞,Queue,假如
From: https://www.cnblogs.com/farsight/p/17544567.html

相关文章

  • JAVA static静态变量依赖spring实例化变量,可能导致初始化出错
    在Java中,静态变量是在类加载时初始化的,而实例变量是在对象实例化时初始化的。如果静态变量依赖于Spring实例化的变量,可能会导致初始化出错的问题。这是因为Spring的实例化过程是在运行时进行的,而类加载和静态变量初始化是在编译时进行的。当静态变量依赖于Spring实例化的变量时,如果......
  • java 阿里云直播配置及推拉流地址获取
    原文地址:https://blog.csdn.net/zhanglei5415/article/details/131551685?spm=1001.2014.3001.5501一、开通阿里云直播首先进入阿里云直播产品主页:https://www.aliyun.com/product/live。点击下方的“立即开通”。如果是还未注册的用户请按照页面提示进行完成注册并实名认证......
  • JAVA 和python 多网卡情况下获取正确的IP地址
    要获取内网地址,可以尝试连接到10.255.255.255:1。如果连接成功,获取本地套接字的地址信息就是当前的内网IP。python实现:importsocketdefextract_ip():st=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)try:st.connect(('10.255.255.255',1))......
  • java如何调用python.py文件并传参
    注意:java调用python.py文件并传参,在windows和linux中使用是不一样的我在windows操作系统中,java调用python文件并传参,是这样写的:完全没问题try{IntegertotalTestCaseCount=0;//传入python文件的参数:StringxmindFilePath,StringtestCaseKeyWo......
  • Java网络编程
    1.ip和端口ip地址InetAddress//因为没有构造方法,所以不能通过new来生成对象,但是可以通过类名来调用类的静态方法InetAddressinetAddress1=InetAddress.getByName("localhost");System.out.println(inetAddress1);InetAddressinetAddress2=I......
  • 520要通过这种方式告白 html+css+javascript canvas桃心代码 可修改 【附完整代码】
    ......
  • 【JAVA开发环境配置】 我也可以让JDK版本来去自由的切换了! 哈哈哈哈 舒服!
    ......
  • eclipse的java+tomcat配置以及一些异常处理
    真是折磨人,下载版本不匹配、匹配了又配置需要插件、插件下载后安装又出错误,运行时有报莫名其妙的错误……过程错了或者稍微忘了哪里就gg,等到最后还得查运行的bug。一、装jdk、jre,并配置环境变量系统变量→新建JAVA_HOME变量。系统变量→寻找Path变量→编辑,在变量值最后输入%JA......
  • JavaScript|ES6语法
    1箭头函数1)语法constfn=(参数)=>{函数体}constfn=(x)=>x+1简写constfn=(x)=>x+1当函数体中只有一行return时可以同时省略{}和return2)示例<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"......
  • 【JavaScript】js 处理复制函数实现
    consthandleCopy=()=>{if(!keywordList.value.length)returnElMessage.warning('没有数据');consttext=JSON.stringify(keywordList.value);constinput=document.createElement('input');input.setAttribute('readonly......