Java 提供的队列

news2024/11/28 20:34:35

一、基础数据结构

1、大O 表示法

O(1):常数级别,它执行的步数都是恒定的,不会因为输入变大而变大,哈希表的查找就是这个级别。
O(N):线性级别,随着输入变大耗费的步数也正向相关,遍历算法就是这个级别。
O(logN):对数级别,输入每变大一倍,耗费步骤则增加1,二分查找算法属于这个级别。
O(N²):平方级别,随着输入的变大所耗费的步数会成倍增加,一般当你的算法使用双层for循环就是这个级别,比如冒泡排序。

2、数组

每个数组都有一个地址,同时可以通过数组的下标方便的算出每个元素的内存地址,
从而实现快速访问和赋值,所以它通过下标查找的效率是O(1) 级别。

3、链表

链表的元素内存地址是不连续的,通过地址引用的方式指向下个元素。
链表的查询O(N) 这个级别,在头节点(第一个节点)进行插入和删除比较快,只要O(1) 就可以了。

4、队列

先入先出的数据结构,尾插和头出,时间复杂度O(1)。
有界队列 :能装入的元素有限。
无界队列 :能装入的元素无限,只要内存还有,就能一直装下去。

5、栈

先入后出/后入先出的数据结构,尾插尾出,时间复杂度O(1)。

二、非阻塞队列(Queue) 

出列入列都不阻塞。入列时,元素数量超过队列总数,会抛异常,出列时,队列为空,取空值。

常用方法:

add():新增一个元索,假如队列已满,则抛异常。
offer():新增一个元素,假如队列没满则返回 true,假如队列已满,则返回 false。
element():获取队列头部一个元素,假如队列为空,则抛异常。
peek():获取队列头部一个元素,假如队列为空,则返回 null。
remove():执行删除操作,返回队列头部的元素,假如队列为空,则抛异常。
poll():执行删除操作,返回队列头部的元素,假如队列为空,则返回 null。

1、LinkedList(线程不安全)

实现的 List、Deque 接口,单链表的无界双端队列,允许元素为 null。

2、ConcurrentLinkedQueue(线程安全)

单向链表结构的无界并发队列,由CAS实现线程安全,性能高。

3、ConcurrentLinkedDeque(线程安全)

双向链表结构的无界并发队列,由CAS实现线程安全,可以从两端进行元素的插入和删除操作,性能略低于ConcurrentLinkedQueue。

4、PriorityQueue(线程不安全)

基于数组实现,可自动扩容,按照元素的优先级进行排序,在插入和删除元素时保持有序状态。
PriorityQueue中的元素必须实现Comparable接口或者通过构造函数提供一个Comparator对象,以便进行元素的比较和排序。

三、阻塞队列(BlockingQueue)

入列时,如果元素数量超过队列总数,会进行等待(阻塞)。出列时,如果队列为空,会进行等待(阻塞)。阻塞队列线程安全,在队列基础上加了两个重要的接口put()、 take()。

1、ArrayBlockingQueue

基于数组结构,有界阻塞队列,创建时必须制定大小。可指定公平性与非公平性,默认为非公平。
ReentrantLock、Condition 实现线程安全,阻塞和唤醒。

2、LinkedBlockingQueue

基于链表结构,有界阻塞队列,创建时如果不指大小,默认大小为 Integer.MAX_VALUE。
ReentrantLock、Condition 实现线程安全。
使用了两个锁,一个用于生产者线程的访问,另一个用于消费者线程的访问,在生产者-消费者模型场景中使用广。

3、SynchronousQueue

不存储任何元素,一个线程put()必须等待另一个线程的take();一个线程take()也要等待另一个线程的take(),否则阻塞。插入null元素,会抛出NullPointerException。

4、LinkedTransferQueue

基于链表结构的无界阻塞队列, SynchronousQueue 和 LinkedBlockingQueue 的合体,
它使用了CAS操作来保证并发安全性,内部用了多个节点来实现队列,
每个节点包含一个元素以及指向下一个节点的指针,性能比 LinkedBlockingQueue 更高。插入null元素会抛NullPointerException异常。

5、LinkedBlockingDeque

基于双向链表结构的双向阻塞队列,可设置大小,也可无界,支持队列和栈的操作,不支持null元素。

6、PriorityBlockingQueue

基于二叉树实现的无界限(最大值Integer.MAX_VALUE - 8),可按优先级对元素进行排序,按优先级顺序出队。
1.允许插入null元素,不允许插入不可比较的元素。
2.迭代PriorityBlockingQueue时,顺序是无法保证的。
3.不支持remove(Object)操作,无法快速地找到并删除指定元素。

import java.util.concurrent.PriorityBlockingQueue;

public class Task implements Comparable<Task> {
    private String name;
    private int priority;

    public Task(String name, int priority) {
        this.name = name;
        this.priority = priority;
    }

    public String getName() {
        return name;
    }

    public int getPriority() {
        return priority;
    }

    @Override
    public int compareTo(Task o) {
        return Integer.compare(o.priority, this.priority);
    }
}

public class PriorityBlockingQueueTest {
    public static void main(String[] args) {
        // 创建一个PriorityBlockingQueue对象
        PriorityBlockingQueue<Task> queue = new PriorityBlockingQueue<Task>();
        // 添加任务到队列中
        queue.offer(new Task("Task1", 3));
        queue.offer(new Task("Task2", 2));
        queue.offer(new Task("Task3", 1));
        // 取出队列中的任务
        while (!queue.isEmpty()) {
            Task task = queue.poll();
            System.out.println("Execute task " + task.getName() + " with priority " + task.getPriority());
        }
    }
}

7、DelayQueue

延时阻塞队列,内部用 PriorityQueue 来存储元素,元素有过期时间,元素的过期时会被取出。

import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;

public class DelayQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        DelayQueue<DelayElement> queue = new DelayQueue<>();

        // 添加元素到队列
        queue.add(new DelayElement("A", 3000));
        queue.add(new DelayElement("B", 2000));
        queue.add(new DelayElement("C", 1000));

        // 取出元素
        System.out.println(queue.take());
        System.out.println(queue.take());
        System.out.println(queue.take());
    }
}

class DelayElement implements Delayed {
    private String name;
    private long expireTime;

    public DelayElement(String name, long delayTime) {
        this.name = name;
        this.expireTime = System.currentTimeMillis() + delayTime;
    }

    @Override
    public long getDelay(TimeUnit unit) {
        return expireTime - System.currentTimeMillis();
    }

    @Override
    public int compareTo(Delayed o) {
        return Long.compare(this.expireTime, ((DelayElement) o).expireTime);
    }

    @Override
    public String toString() {
        return "DelayElement{" +
                "name='" + name + '\'' +
                '}';
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/763727.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【雕爷学编程】Arduino动手做(164)---Futaba S3003舵机模块2

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

网络版计算器

本次我们实现一个服务器版本的简单的计算器&#xff0c;通过自己在应用层定制协议来将数据传输出去。 协议代码 此处我们为了解耦&#xff0c;采用了两个类&#xff0c;分别表示客户端的请求和服务端的响应。 Request class Request { public:Request(){}Request(int x, int…

复习单例模式

单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单个…

在SpringBoot中实现文件上传

1.创建一个SpringBoot的项目&#xff0c;需要导入spring-boot-starter-web的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> 2.编写文件的核心配置applica…

ASEMI二极管MURF2080CTR封装, MURF2080CTR大小

编辑-Z MURF2080CTR参数描述&#xff1a; 型号&#xff1a;MURF2080CTR 最大峰值反向电压(VRRM)&#xff1a;800V 最大RMS电压(VRMS)&#xff1a;430V 最大直流阻断电压VR(DC)&#xff1a;800V 平均整流正向电流(IF)&#xff1a;20A 非重复峰值浪涌电流(IFSM)&#xff1…

亚马逊会员日结束了,如何防止销量和排名“断崖式”下跌?

令人瞩目的2023亚马逊Prime会员日落下了帷幕&#xff0c;据官方数据显示&#xff0c;48小时售出商品超3.75亿件&#xff0c;再一次创造了历史新纪录&#xff01; 好不容易因为亚马逊会员日提升了销售额和曝光了品牌&#xff0c;那么会员日结束了&#xff0c;如何稳住您的销量和…

【网站建设】HTTP/HTTPS 是什么?有什么区别?

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前学习C/C、算法、Java等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&#xff0c;感…

STM32H743 W25Q128 Keil烧录算法的制作、内存映射代码、分散加载文件源码分享

一、W25Q128烧录算法的制作 1、前言 最近做项目用到STM32H743这款芯片&#xff0c;其内部FLash有2M&#xff0c;但是项目中用到touchgfx&#xff0c;如果资源放到内部Flash中会造成两个问题&#xff0c;一是图片过多会导致内部Flash不够用&#xff0c;二是每次修改一下程序都…

一文了解近端边缘 IT 基础架构技术需求

随着边缘计算相关技术的逐渐成熟&#xff0c;边缘应用的种类也呈现多样化发展。IDC 2023 年发布的《全球边缘支出指南》归纳出 400 多种跟边缘相关的应用——这是在从 9 个地理区域、17 个技术市场、6 个技术领域和 19 个行业当中汇总出来的。 边缘计算的复杂和边缘应用的多样…

Leetcode-每日一题【24.两两交换链表中的节点】

题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4]输出&#xff1a;[…

【玩转Linux操作】详细讲解 Linux分区磁盘 操作以及相关的命令

&#x1f38a;专栏【玩转Linux操作】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f354;什么是Linux的分区&#x1f354;Linux分区的作用&a…

没有代码基础如何学习自动化测试

因为最近在群里有一些同学&#xff0c;之前没做过自动化测试&#xff0c;但是限于领导要求&#xff0c;或者自己想提升了&#xff0c;开始研究自动化测试&#xff0c;最近记忆比较深的低级的几个问题是&#xff1a; 1、编写一个python的类将 __init__写成_init_苦于问题一直解…

springboot项目使用mybatis-plus启动报错

在使用最新的mybatis-plus的时候&#xff0c;遇到一个报错 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name payMentController: Unsatisfied dependency expressed through field payMentService; nested exception is…

mybatis-plus代码生成器使用指南

mybatis-plus代码生成器 官网&#xff1a;mp代码生成器&#xff08;新&#xff09; 1、导入依赖 使用最新版本&#xff1a;3.5.3.1版本&#xff0c;老版本不兼容 <properties><mybatis-plus.version>3.5.3.1</mybatis-plus.version><freemarker.versio…

集成VCO-Cadence ADE相位噪声分析

集成VCO-Cadence ADE相位噪声分析 简介环境软件工艺 参考振荡器原理图相位噪声说明pss设置1234 pnoise设置12345 结果 简介 本文主要是使用Cadence ADE仿真1GHz交叉耦合振荡器&#xff0c;得到相位噪声曲线&#xff0c;主要记录仿真设置过程&#xff0c;仅供参考&#xff0c;如…

零拷贝技术(DMA、MMAP、sendfile)

零拷贝mmap、sendfile 定义 零拷贝技术主要是解决传统网络I/O操作中发送文件的性能问题&#xff1a;如下图表示一次read和write时传统I/O涉及到的CPU操作&#xff1a; 涉及到4次用户态↔内核态上下文切换&#xff0c;其中read切换两次、write切换两次&#xff1b;涉及到4次数…

IntelliJ IDEA 忽略Git提交

在项目下新建 .gitignore 文件 在 .gitignore 文件写入以下内容&#xff0c;从上图可以看到&#xff0c;忽略提交的这些目录/文件变成了黄色

P2372 yyy2015c01挑战算周长

yyy2015c01挑战算周长 题目背景 yyy2015c01 快速的解决了问题&#xff0c;受到邻居们的赞许&#xff0c;高兴的回到家&#xff0c;把糖给了妈妈&#xff0c;吃了香喷喷的午饭&#xff0c;又睡了一个甜甜的午觉&#xff0c;感觉人生真美好。下午爸爸回到家&#xff0c;听说了 …

设计模式 ~ 单例模式

单例模式 单例模式是一种设计模式&#xff0c;指在确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例&#xff1b; 前端对于单例模式不常用&#xff0c;但是单例的思想无处不在&#xff1b; 创建之后缓存以便继续使用&#xff1b; 如&#xff1a;弹窗、遮罩…

HCIP——HCIA回顾及静态实验

HCIP HCIA一、知识回顾1、OSI七层参考模型&#xff1a;2、重要的几个协议报头格式 二、静态实验1、实验拓扑图2、实验要求3、实验思路4、实验步骤1、给接口划分IP地址以及配置环回地址2、交换机配置划分VLAN3、配置静态路由4、配置DHCP服务5、测试6、优化 HCIA 1、七层参考模型…