当前位置: 首页 > news >正文

深入List集合:ArrayList与LinkedList的底层逻辑与区别

目录

一、前言

二、基本概念

三、相同之处

四、不同之处

五、ArrayList 底层

六、LinkedList 底层

七、ArrayList 应用场景

八、LinkedList 应用场景

九、ArrayList和LinkedList高级话题 

十、总结


一、前言


        在Java集合的广阔舞台上,ArrayList与LinkedList以其独特的魅力,演绎着数据结构与算法的微妙平衡。一个静如处子,以数组之基,实现高效随机访问;一个动如脱兔,借链表之灵,擅长灵活插入删除。让我们一同潜入技术深海,探寻这两大集合类的独特魅力与适用之道。

二、基本概念


ArrayList定义:
        ArrayList是Java中的一个动态数组实现,它属于List接口的子类。ArrayList能够根据需要自动调整其大小,存储的元素是有序的,并且可以通过索引快速访问。它支持泛型,可以存储任何类型的对象,同时提供了添加、删除、查找和遍历等一系列常用的操作方法。
LinkedList定义:
        LinkedList是Java中的一个双向链表实现,同样实现了List接口。与ArrayList不同,LinkedList中的元素不是存储在连续的内存空间中,而是通过节点之间的引用连接起来的。每个节点都包含数据部分以及指向前一个和后一个节点的引用。LinkedList也支持泛型,并提供了与ArrayList类似的常用操作方法。


三、相同之处


        ArrayList和LinkedList作为Java中List接口的实现类,具有一些共同点。它们都能够动态地存储元素,并且可以根据需要自动调整容量大小。同时,它们都支持泛型,可以存储任何类型的对象,并且保证了类型安全。
        这两种集合类都维护了元素的插入顺序,使得元素可以按照添加的顺序进行访问。此外,它们都提供了一系列常用的操作方法,如添加、删除、查找和遍历等,这些操作都可以通过List接口中的方法进行调用。
        因此,在Java编程中,ArrayList和LinkedList都可以作为有序集合类来使用,根据具体需求选择适合的实现类即可。
 


四、不同之处


        ArrayList和LinkedList是Java中两种常用的List接口实现,它们在内部实现和性能特性上存在显著差异。
        ArrayList基于动态数组,支持通过索引快速访问元素,但在插入和删除元素时可能需要移动其他元素,时间复杂度较高。而LinkedList则基于双向链表,插入和删除操作只需修改相关节点的前后引用,时间复杂度较低,但随机访问元素需要从头节点开始遍历,性能较差。
        此外,ArrayList在内存上需要预留空间并可能在扩容时产生额外开销,而LinkedList的每个节点则需要额外的内存来存储前后节点的引用。因此,在选择时应根据具体使用场景来决定。

五、ArrayList 底层


        arraylist集合的底层其实是基于数组实现的,数组我们并不陌生。
        数组的特点:数组其实实在内存当中的一块连续区域,并且它会把这一块连续的区域分割成若干个相等的小区域,每块区域都有自己的索引,每个区域都是用来装一个数据的。
 
        数组最重要的特点就是他的查询速度是非常快的,但是很多人直接说数组的查询速度很快,这个其实是不准确的,它严格来说是根据索引查询数据比较的快。从头到尾的查很慢。
        但是如果是根据索引来查就是非常快的了,就比如说需要查2号索引处的数据,它可以一下子定位数组位置,因为数组有一个自己的起始地址,起始地址可以找到最左侧的位置,如果要查2号索引处的数据,直接让起始地址加2,就可以定位到索引为2的位置,最后将数值C取出来。
        同样,如果要查5号索引处的数值,那么直接让起始索引加5就可以了。所以这才是它根据索引查询速度快的原因。也就是它是通过地址值加索引来进行定位的查询任意数据耗时是相同的。也就是不管你是查询2号位置的数据还是5号位置的数据它所要耗费的时间是一样的,所以说它根据索引查询速度快。
        但是它的删除效率是很低很低的,如果要删除B值,删除以后需要将后面的所有值一个一个的向前挪一位,这样才能保证数据的连续性,所以如果数据量大的时候,这样大量的去迁移数据的时候,就会带来一些性能问题,所以说它的删除效率是比较低的。


        同样,添加的时候也是效率极低的,需要将添加位置后面的所有数据向后移动。或者是当我的数组已经满了的时候,我再添加数据的时候我这里面不够放怎么办?他又要扩容,就是把数组的范围变大,然后再把数据又迁移过来再把新添加的数据放在空出来的位置上去。所以又要扩容又要迁移,他的效率一定是不会高的。


        那么扩容到底是如何使用数组来实现的呢?细节是怎么回事呢?
        当我们使用无参构造器去创建这个集合对象的时候,他就会在底层创建一个默认长度为0的数组,也就是一个没有任何数据的空数组然后会用一个size来记录数组的大小,当我们第一次添加数据到里面去的时候,他会创建一个新的长度为10 的数组,交给elementData来记录。
 
        在添加第一个数据之后,会将size指向它的第二个索引。同理,每加一次数据之后,size都回向后移动相应的距离。
 
 
        当数组存满之后要怎么办呢?

        当我们在存第11个数据的时候,他就会自动将数组的长度扩容到原来的1.5倍,也就是将数组长度变为15。但是注意,它是创建了一个长度为15 的数组,所以它会再将原来长度为10 的数组内的原数据迁移到长度为15 的新数组中,然后再把新数组放到后面去。
 
 
        如果一次性添加多个数据,比如说如果一次性添加11个数据,那么它其实1.5倍是依旧不够放下数据的。
        所以它此时会创建一个长度为实际长度为准的数组,也就是10+11=21位长度的数组,然后再将数据添加进去。

总结:查询快,增删慢。

六、LinkedList 底层


        Linkedlist的底层是基于双链表实现的
        那么什么是链表呢?链表起始是由一个一个结点组成的,这些结点在内存中并不是连续存储的,而是在内存中分散存储的,但是链表的每个结点他除了会包含数据值之外,还会包含下一个结点的地址信息,通过这个地址信息,我们是可以找到下一个地址结点的,这样就实现了一个结点链接另一个结点的形式,这就是所谓的链表。
 
(如图所示),我们可以从头开始顺藤摸瓜的找到每一个结点。也就是找到每一个数据进行相应的处理。
        那么链表是如何形成的呢?
        在添加第一个数据A的时候,它会被记为链表的头结点,我们可以通过地址找到头结点再找到整个列表。再添加第二个数据B,数据会有一个自己的地址,假如说地址是11,然后它会将地址交给头结点A来记住。
 
        同理,再向后添加数据D、E 的时候,只需要使前一个数据记住他们的地址值即可完成首尾相连的链表形结构。
 
        那么链表数据结构有什么特点呢?
 
        查询比较慢:无论查询哪个数据都要从头开始找,包括根据索引查也同样是慢的,为什么呢?比如说要找到第二个位置处的数据,是不能马上找到第二个索引位置处的,因为它的元素在内存中不是连续的,不可能通过头部地址一下子定位到这个位置,即使要找2号索引位置处的数据也只能从头开始找。

        增删比较快:如果需要在链表中添加一个数据C,那么只需要把数据C放到任何一个位置,然后让C对应的下一个数据地址指向D,然后让B指向C(将B存储的下一个数据地址改成C的地址)。
 
        这样就添加进去了,也不需要挪动原来元素的位置。而且也不存在扩容的问题,因为它的元素在内存中都是分散存储的,无论加多少数据都是不存在扩容或者移动原来元素位置的。所以说添加的速度是比较快的。
 
        如果要删除CE之间的数据D,那么只需要将C对应的下一个数据地址指向数据E,然后再将数据D删除就可以了。也不需要迁移元素。
 
        单向链表与双向链表
        linkedlist是双向链表,除了从前往后查找之外,同时它的每一个结点也会记前一个结点的地址,也就是说可以从为结点开始从后往前找。所以双向链表就是可以从两头开始查。所以说双向链表的查询速度要胜于单向链表,但是因为链表只能从前往后找或者从后往前找,所以他的查询速度还是要慢于可以直接利定位索引位置的数组的。只是增删的时候速度要优于数组。
 
        在java中大多数情况都会使用双向链表。

七、ArrayList 应用场景


        ArrayList 是一种基于数组实现的动态数据结构,在Java集合框架中扮演着重要角色。它通过自动调整数组大小来适应元素数量的变化,提供了高效且灵活的存储方式。以下是ArrayList在多个生动应用场景中的具体应用:
        1.    动态数组存储
场景描述:
        想象你正在编写一个程序,需要存储用户输入的一系列数据,但事先并不知道用户会输入多少数据。这时,一个能够动态调整大小的数组就显得尤为重要。
ArrayList应用:
        ArrayList正是为此而生。它可以根据需要自动调整大小,无需担心数组越界的问题。你可以随时向ArrayList中添加或删除元素,而无需手动管理数组的大小。
        2.    批量数据处理
场景描述:
        在数据分析或科学计算中,经常需要处理大量的数据。这些数据可能来自文件、数据库或网络请求等。
ArrayList应用:
        ArrayList提供了高效的批量数据处理能力。你可以将大量数据一次性添加到ArrayList中,然后利用Java提供的各种集合操作方法来处理这些数据,如排序、搜索、过滤等。
        3.    对象集合管理
场景描述:

        在面向对象编程中,经常需要管理一组对象。例如,你可能有一个Person类,需要存储多个Person对象的集合。
ArrayList应用:
        ArrayList支持泛型,可以确保类型安全。你可以创建一个ArrayList<Person>来存储Person对象的集合,并利用ArrayList提供的各种方法来管理这些对象,如添加、删除、查找等。
        4.    作为方法参数和返回值
场景描述:

        在编写方法时,有时需要传递或返回一组数据。这些数据可能来自方法的内部处理,也可能需要传递给其他方法进行处理。
ArrayList应用:
        ArrayList可以作为方法参数和返回值来传递或返回一组数据。这样,你可以利用ArrayList的灵活性和高效性来简化方法的编写和调用。
        5.    实现简单的数据结构
场景描述:

        在算法和数据结构的学习中,经常需要实现一些简单的数据结构,如栈(Stack)和队列(Queue)的简化版。
ArrayList应用:
        虽然ArrayList不是专门为栈和队列设计的,但你可以利用它的动态调整大小和随机访问特性来实现这些数据结构的简化版。例如,你可以使用ArrayList的add方法在末尾添加元素来实现栈的压栈操作,使用remove(int index)方法或get(int index)方法结合remove方法来实现栈的弹栈操作;同样地,你也可以使用ArrayList来实现队列的简化版。

八、LinkedList 应用场景


        LinkedList 是一种非常灵活的数据结构,它基于链表的原理,通过节点(Node)之间的引用(或指针)来存储数据。每个节点包含数据部分和指向下一个节点的引用。这种结构使得 LinkedList 在很多应用场景中都表现出色。
        1. 队列(Queue) - 先进先出(FIFO)
场景描述:

        想象你在一家银行排队办理业务。第一个人先来,第一个被服务;后来的人只能排在队伍后面,等待前面的人办完业务后再轮到自己。这就是典型的先进先出(FIFO)原则。
LinkedList应用:
        在 LinkedList 中,我们可以将队列设计成使用头节点(head)和尾节点(tail)来管理。新元素总是添加到队列的尾部,而移除操作总是从队列的头部进行。这样,最早加入的元素总是最先被移除。
        2. 栈(Stack) - 后进先出(LIFO)
场景描述:

        想象你有一堆书,每次你只能看到最上面的一本书。如果你想取一本书,你必须先移除上面的所有书。这就是后进先出(LIFO)原则。
LinkedList应用:
        在 LinkedList 中,栈的实现非常简单。我们只需要一个指向栈顶(即最后一个加入的元素)的引用。新元素总是添加到栈顶,移除操作也总是从栈顶进行。这样,最后加入的元素总是最先被移除。
        3. 双向链表(Doubly Linked List) - 双向遍历
场景描述:

        想象你在一个环形跑道上跑步,你可以向前跑,也可以随时停下来向后跑。双向链表允许你从任意节点向前或向后遍历。
LinkedList应用:
        双向链表(Doubly Linked List)的每个节点除了包含数据和指向下一个节点的引用外,还包含一个指向前一个节点的引用。这使得双向链表在需要频繁进行前后遍历的场景中非常有用,比如实现撤销(Undo)操作、滑动窗口算法等。
        4. 散列表的冲突解决(Linked List as a Collision Resolution Method)
场景描述:

        想象你有一个很大的书架,但上面的书没有按照任何顺序排列。当你想要找一本书时,你可能需要从头开始一本一本地找,直到找到为止。在散列表(Hash Table)中,如果两个键的哈希值相同(即发生冲突),我们可以使用链表来解决这个冲突。
LinkedList应用:
        在散列表的实现中,当发生冲突时,我们可以将具有相同哈希值的元素存储在一个链表中。这样,虽然查找某个特定元素可能需要遍历链表,但总体上仍然保持了散列表的高效性。
        5. 实现图(Graph)的邻接表(Adjacency List)
场景描述:

        想象你有一张复杂的交通网络图,每个城市都是一个节点,城市之间的道路是连接这些节点的边。邻接表是一种用链表来表示图中节点之间连接关系的方法。
LinkedList应用:
        在图的邻接表表示法中,每个节点都有一个链表,链表中包含与该节点直接相连的所有节点。这种方法在处理稀疏图(即边数远少于节点数平方的图)时非常高效,因为它避免了使用二维数组来存储边信息时的空间浪费。

九、ArrayList和LinkedList高级话题 


        在Java中,ArrayList和LinkedList作为两种常见的集合实现,与多种设计模式有着密切的联系。以下是与ArrayList和LinkedList相关的一些设计模式介绍:
        迭代器模式(Iterator Pattern)
        迭代器模式是一种设计模式,它提供了一种方法顺序访问一个聚合对象中的各个元素,而不暴露其内部的表示。在Java中,ArrayList和LinkedList都实现了Iterable接口,因此它们都支持迭代器模式。
o    特点:
o    提供一个统一的接口来遍历集合中的元素,而无需了解集合的内部结构。
o    迭代器模式将集合的遍历操作从集合类中分离出来,使得集合类的职责更加单一。
o    在ArrayList和LinkedList中的应用:
o    ArrayList和LinkedList都通过实现Iterable接口来提供迭代器。
o    迭代器内部维护了一个指向当前元素的游标(cursor),通过调用hasNext()和next()方法来遍历集合中的元素。
        观察者模式(Observer Pattern)
        虽然ArrayList和LinkedList本身并不直接实现观察者模式,但它们可以作为观察者模式中的被观察对象(Subject)或观察者(Observer)来使用。
o    特点:
o    定义对象间的一种一对多的依赖关系,当一个对象改变状态时,其相关依赖对象皆得到通知并被自动更新。
o    观察者模式主要用于实现事件处理系统、消息广播系统等。
o    在ArrayList和LinkedList中的潜在应用:
o    如果有一个集合对象(如ArrayList或LinkedList)需要通知其他对象关于其内容的变化(如添加、删除元素),那么可以将该集合对象作为被观察对象,其他对象作为观察者。
o    当集合对象发生变化时,它可以通过调用观察者的更新方法来通知它们。
        然而,需要注意的是,在Java的标准库中,ArrayList和LinkedList并没有直接提供对观察者模式的支持。如果需要实现观察者模式,通常需要自定义一个被观察对象类,并在该类中维护一个观察者列表,以及相应的添加、删除和通知观察者的方法。
        其他相关设计模式
除了迭代器模式和观察者模式外,还有一些其他设计模式与ArrayList和LinkedList有关,如:
o    工厂模式:可以用于创建ArrayList或LinkedList的实例,而无需直接调用它们的构造函数。
o    单例模式:虽然与ArrayList和LinkedList的直接关系不大,但在某些情况下,可以使用单例模式来确保一个集合类只有一个实例(尽管这通常不是集合类的常见用法)。
o    装饰器模式:可以用于在不修改现有集合类的情况下,为其添加新的功能或行为。例如,可以        创建一个装饰器类来包装一个ArrayList或LinkedList,并在其基础上添加日志记录、性能监控等功能。
        总的来说,ArrayList和LinkedList作为Java集合框架中的核心组件,与多种设计模式有着紧密的联系。通过理解和应用这些设计模式,可以更加灵活地使用这些集合类,并构建出更加健壮、可扩展和可维护的软件系统。


十、总结


        ArrayList是一种高效且灵活的动态数据结构,在多个应用场景中都表现出色。从简单的动态数组存储到复杂的对象集合管理,再到作为方法参数和返回值传递或返回一组数据,ArrayList都能提供高效且直观的解决方案。通过理解ArrayList的工作原理和应用场景,我们可以更好地利用这种数据结构来解决实际问题。

如果文章对您有帮助,还请您点赞支持
感谢您的阅读,欢迎您在评论区留言指正分享

相关文章:

深入List集合:ArrayList与LinkedList的底层逻辑与区别

目录 一、前言 二、基本概念 三、相同之处 四、不同之处 五、ArrayList 底层 六、LinkedList 底层 七、ArrayList 应用场景 八、LinkedList 应用场景 九、ArrayList和LinkedList高级话题 十、总结 一、前言 在Java集合的广阔舞台上&#xff0c;ArrayList与LinkedLis…...

mac安装appuim

要在macOS上安装Appium&#xff0c;这是一个自动化测试框架&#xff0c;可以用来对移动应用进行测试&#xff08;支持iOS和Android应用&#xff09;。为了安装Appium和其依赖的环境&#xff0c;你需要做一些准备工作。以下是详细的安装步骤&#xff1a; 前提条件 1、macOS系统…...

Telegram bot Mini-App开发实践---Telegram简单介绍与初始化小程序获取window.Telegram.WebApp对象并解析

➡️【好看的灵魂千篇一律,有趣的鲲志一百六七!】- 欢迎认识我~~ 作者:鲲志说 (公众号、B站同名,视频号:鲲志说996) 科技博主:极星会 星辉大使 后端研发:java、go、python、TS,前电商、现web3 主理人:COC杭州开发者社区主理人 、周周黑客松杭州主理人、 AI爱好…...

绿光一字线激光模组:工业制造与科技创新的得力助手

在现代工业制造和科技创新领域&#xff0c;绿光一字线激光模组以其独特的性能和广泛的应用前景&#xff0c;成为了不可或缺的关键设备。这种激光模组能够发射出一条明亮且精确的绿色激光线&#xff0c;具有高精度、高稳定性和长寿命的特点&#xff0c;为各种精密加工和测量需求…...

鸿蒙进阶篇-Math、Date

“在科技的浪潮中&#xff0c;鸿蒙操作系统宛如一颗璀璨的新星&#xff0c;引领着创新的方向。作为鸿蒙开天组&#xff0c;今天我们将一同踏上鸿蒙基础的探索之旅&#xff0c;为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…...

定时器简介

TIM(Timer定时器)简介 在第一部分,我们主要讲的是定时器基本定时的功能&#xff0c;也就是定一个时间&#xff0c;然后让定时器每隔这个时间产生一个中断&#xff0c;来实现每隔一个固定时间执行一段程序的目的&#xff0c;比如你要做个时钟、秒表&#xff0c;或者使用一些程序…...

3C产品说明书电子化转变:用户体验、环保与商业机遇的共赢

在科技日新月异的当代社会&#xff0c;3C产品&#xff08;涵盖计算机类、通信类和消费类电子产品&#xff09;已成为我们日常生活中不可或缺的重要元素。与此同时&#xff0c;这些产品的配套说明书也经历了一场从纸质到电子化的深刻变革。这一转变不仅体现了技术的飞速进步&…...

redis:主从复制

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言主从模式复制拓扑结构主从节点建立复制流程数据同步 psyncpsync运行流程全量复制流程部分复制流程实时复制总结 前言 分布式系统&#x…...

思考Redis的用途 2024-11-19

一.分布式锁 这个要保证多个服务器执行一段逻辑时的锁操作&#xff0c;就用这个。如&#xff1a;账号注册&#xff0c;防止同一个账号注册多次。 二.全局共享数据 1.多个Game服情况下&#xff0c;要共享一些数据&#xff0c;比如&#xff1a;登录token信息之类的。 痛点&…...

根据条件 控制layui的table的toolbar的按钮 显示和不显示

部分代码&#xff1a; <!-----查询条件-----> <input type"date" id"StartDate" onchange"PageList()" /> <input type"date" id"EndDate" onchange"PageList()" /><!-----表格Table-----&…...

什么是C++中的初始化参数列表,它的作用是什么?

在 C 中&#xff0c;初始化参数列表&#xff08;Initialization List&#xff09;是一个构造函数的特性&#xff0c;用于初始化类成员变量和基类。它是在构造函数的声明中&#xff0c;以冒号&#xff08;:&#xff09;开头&#xff0c;跟随一系列成员变量的初始化表达式的列表。…...

python基础之学生成绩管理系统

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 声明&#xff1a;本文主要用作技术分享&#xff0c;所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险&#xff0c;并遵循相关法律法规。 while…...

SQL Server Management Studio 的JDBC驱动程序和IDEA 连接

一、数据库准备 &#xff08;一&#xff09;启用 TCP/IP 协议 操作入口 首先&#xff0c;我们要找到 SQL Server 配置管理器&#xff0c;操作路径为&#xff1a;通过 “此电脑” 右键选择 “管理”&#xff0c;在弹出的 “计算机管理” 窗口中&#xff0c;找到 “服务和应用程…...

大数据挖掘期末复习

大数据挖掘 数据挖掘 数据挖掘定义 技术层面&#xff1a; 数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中&#xff0c;提取隐含在其中、人们事先不知道的、但又潜在有用的信息的过程。 数据准备环节 数据选择 质量分析 数据预处理 数据仓库 …...

凸函数与深度学习调参

问题1&#xff1a;如何区分凸问题和凹问题&#xff1f; 问题2&#xff1a;深度学习如何区分调参&#xff1f;...

Java前端基础——CSS

一、CSS介绍 1.1 什么是CSS CSS(Cascading Style Sheet)&#xff0c;层叠样式表,用于控制页面的样式. CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离. 1.2 基本语法规范 选择器 {⼀条/N条声明} • 选择器决定针…...

Photino:通过.NET Core构建跨平台桌面应用程序,.net国产系统

一、Photino.NET简介&#xff1a; 最近发现了一个不错的框架 Photino.Net 一份代码运行&#xff0c;三个平台 windows max linux &#xff0c;其中windows10,windows11,ubuntu 18.04,ubuntu 20.04 已测试均可以。mac 因为没有相关电脑没有测试。 github:https://github.com/t…...

个人全栈开发微信小程序上线了(记日记)

个人开发的全栈项目&#xff0c;《每日记鸭》微信小程序上线了&#xff01; 主要是技术栈&#xff1a;uniapp,koa2,mongodb,langchian&#xff1b; 感兴趣的小伙伴可以来捧捧场&#xff01;...

Linux移植IMX6ULL记录 一:编译源码并支持能顺利进入linux

目录 前言 一、不修改文件进行编译 二、修改设备树文件进行编译 前言 我用的开发板是100_ask_imx6ull_pro&#xff0c;其自带的linux内核版本linux-4.9.88&#xff0c;然后从linux官网下载过来的linux-4.9.88版本的arch/arm/configs/defconfig和dts设备树文件并没有对imx6ull…...

idea正则表达式-正则替换示例-2024.11笔记

注意idea中反向引用的格式是【$1】换行符是【\n】 需要在如下的代码中往接口的方法中添加一行注解&#xff0c;注解需要用到以后注解的中文备注 原文 Autowired private WomanService womanService; /** * 自定义分页 */ PostMapping("/page/{current}/{…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...