ArrayList 和 LinkedList 之间应该怎么选择

使用 Cadence ams 仿真器 对 混合信号电路 进行仿真 文章目录Cadence 基于ams仿真器的混合信号电路仿真建立数字(Digital)模块建立 Analog - Digital 混合仿真原理图建立 Analog - Digital 混合仿真config文件配置混合信号电路仿真环境针对混合信号电路demo进行仿真 Cadence 基于ams仿真器的混合信号电路仿真 你好,这里是一篇关于使用 Cadence 软件通过 ams 仿真器对混合信号电路(D... 阅读详情

这篇文章是来自知乎上的一个问题。

相信很多人在面试时都被问过这个问题,然后一般回答:ArrayList在指定下标访问时快,LinkedList在插入/删除元素时快。

其实这是一种人云亦云的谬误。可能最初有人这么回答,然后不加验证地转来转去,后面就成了八股文中的“标准答案”。

这个问题其实早在2015年,就由作者Joshua Bloch在Twitter上给出了回答:“有人真的使用过LinkedList吗?我写了它,但是我从没用过”。

请添加图片描述

以下是我在知乎上的回答。

——————————————————————————————————————————————————————————

先说结论:需要List的场合,绝大部分情况下选择ArrayList;需要Queue或Stack的场合,绝大部分情况下选择ArrayDeque。

看实际的性能测试。对ArrayList和LinkedList分别做100000次以下操作,统计执行时间(ms):

尾部插入头部插入中间插入遍历
ArrayList53461527
LinkedList2450442

逐条分析解释:

  1. 尾部插入:相差不大,都是O(1)的操作。
  2. 头部插入:LinkedList明显优于ArrayList。因为ArrayList每次操作都涉及底层全量数组的System.arraycopy();而LinkedList是双向链表,内存保存了headNode,所以是O(1)的操作。
  3. 中间插入:ArrayList明显优于LinkedList。因为LinkedList每次需要遍历寻找插入节点,仅这一步复杂度就是O(n)。
  4. 遍历:相差不大。

除了上述时间消耗的比较,在空间消耗上ArrayList也优于LinkedList。虽然ArrayList会扩容到1.5倍,但是LinkedList内部为每个存储元素封装了Node对象,除了Node对象头部,还要保存前后Node的地址和当前存储元素的地址,实际上LinkedList占用内存要远大于ArrayList。

结论:仅在头部插入/删除时,LinkedList在时间上有性能优势。

不过问题来了:既然你需要在头部频繁插入/删除,那么为什么不选择更合适的数据结构呢?比如Stack或者Queue。

那么LinkedList是实现这两种数据结构的最优选择吗?答案也不是,而是ArrayDeque。

不多说,再看性能测试对比。对ArrayDeque和LinkedList分别做1000000次以下操作,统计执行时间(ms):

头部插入尾部插入遍历
ArrayList121266
LinkedList6115310

可以看出,ArrayDeque在每项时间指标都优于LinkedList。另外在空间上,ArrayDeque底层使用的循环数组也是优于LinkedList使用的Node链表。

结论:无论在时间还是空间上,ArrayDeque都优于LinkedList。

顺便说一句,JDK中还提供了Stack类。虽然它名字就叫Stack,一般不会用到它实现栈,甚至Java官方都建议不要使用它。因为有以下缺陷:

  1. 继承关系和方法设计混乱。
  2. 为了线程安全所有方法加线程锁,性能较差。

那么综合看来,LinkedList是否一无是处呢?我觉得它的存在还是有一定价值的:

  1. 典型的数据结构。作为一种基础数据结构,链表在几乎每种语言中都有自己的实现。LinkedList作为链表在Java中的实现,起到了教学和理论研究的作用。它在Java中性能不好更多与JVM本身的内存结构有关,并非在所有语言中都是这样。
  2. 历史原因。LinkedList刚出来时还是实现Queue和Stack的最佳选择,不过后面1.6版本推出的ArrayDeque在性能上后来居上,为了版本兼容的考虑LinkedList还是保留了下来。
Pixhawk RPi CM4 Baseboard 树莓派CM4安装Ubuntu20.04 server 配置ros mavros mavsdk cm4配置ros mavros连接pixhawk4 Pixhawk RPi CM4 Baseboard 阅读详情

相关推荐

Python逻辑回归——以车险定价为例(附代码)

保费定价也成为费率厘定,是保险公司运营的环节之一。其过程是根据保单(被保险人)的损失经验和其他相关信息建立模型,并且对未来的保险成本(赔款、代理人佣金、一般管理费用、理赔费用以及支持该业务所需的资本金成本)进行预测的过程。保险公司实际使用的费率还会受到市场供求关系和公司自身发展战略的影响。汽车保险也称机动车辆保险,失意机动车辆本身及其第三者责任等为保险标的的一种运输工具险,在非寿险井算领域中占有重要地位。

m0_62929945的博客 1984

ArrayList和LinkedList区别

ArrayList:顺序表,动态数组,随机访问。无参构造函数:使用无参构造函数初始化ArrayList后,它当时的数组容量为 0。如果使用了无参构造函数来初始化ArrayList, 只有当我们真正对数据进行添加操作add时,才会给数组分配一个默认的初始容量。1.ensureCapacityInternal()点进这个方法2. calculateCapacity()点进这个方法3.此时这才会分配默认的初始容量。

熙熙小学姐 776

解密网页视频Blob链接:从防盗链到流媒体分片技术

本文深入解析了网页视频中Blob链接的工作原理,揭示了其作为现代视频防盗链与流媒体分片技术核心的本质。文章详细阐述了Blob对象与Media Source API如何协同工作,将视频数据分片传输,并结合HTML5的video元素实现安全、流畅的播放体验,有效提升了资源保护能力。

c7d8e的博客 317

【17期】什么情况用ArrayList or LinkedList呢?

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 7 分钟。来自:网络ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个...

良月柒 614

地理空间坐标系统-不同椭球基准间的坐标转换

基于同一个椭球基准,可以构建三类地理空间坐标系:大地球面坐标系、大地空间直角坐标系、大地投影坐标系。由于坐标原点和椭球长短半径等都相同,这三类坐标系之间可以通过无损的数学方法相互之间进行转换。那么现在问题来了,不同椭球基准(在全球范围来看存在成百上千的椭球基准)之间的坐标怎么转换?比如,北京54、西安80、国家2000,特别是在我国,现在主推国家2000坐标系,那么如何将历史的测绘成果(北京54和...

技术改变世界 8336

安装anaconda3时出现错误:Failed to link extracted packages to D:\anaconda!...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1481

LinkedList 插入和 ArrayList

分别是:10万、100万、1000万的数据在两种集合下面不同位置的插入效果! ArrayList 中间插入快。 LinkedList 头插、尾插快。 一、数据结构 Linked + List = 链表 + 列表 = LinkedList = 链表列表 LinkedList,是基于链表实现,由双向链条next、prev,把数据节点穿插起来,所以在插入数据时,是不需要ArrayList那样扩容数组。 二、源码分析 1.初始化 与ArrayList不同,LinkedList初始化不需要创

小学生的博客 2907

【批处理脚本】-0.1-如何运行批处理bat文件

如何运行批处理bat文件

「汽车电子助手」的博客 1585

Java LinkedList

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。 链表可分为单向链表和双向链表。 一个单向链表包含两个值: 当前节点的值和一个指向下一个节点的链接。 一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。 Java LinkedList(链表) 类似于 ArrayList,是一种常用的数据容器。 与 ArrayList 相比,LinkedList 的增加和删除对操作效率更高,而查找和修改的操作效率较低。

weixin_43055166的博客 284

MacBook Air老本重装系统

手里的这个本子型号是A1466,cpu i5,4G内存,硬盘ssd 120G。 重装系统可以在原系统上升级到更新版本,或者用U盘安装。 先确定,这个本子可以安装什么系统。 最权威的信息当然是apple的官网,地址:https://support.apple.com/zh-cn/HT211683 在“检查兼容性”中,可以依次检查每个系统兼容的硬件型号。Mojave是A1466能安装的最高版本。 确认兼容性后,下一步就是下载安装文件。还是这个页面稍下面一点可以找到。 这里告诉用户文件可以在什

bigwood99的博客 2万+

数仓建模—维度建模之维度表

首先要学会识别维度,维度是相对稳定的、可抽象具有共性的、固有的(天然的)描述度量或事实的上下文属性信息,失去维度信息的度量信息是没有意义的或者说是失去维度信息的事实表是没有意义的。其次要掌握维度表的设计原则和设计流程,从而更加科学的设计维度表,其实这些东西都是术,我们一直都说一句话大道至简,其实如果你掌握了精髓,抛开这些术也可以做到得心应手,这就像张无忌练太极剑一样,忘记了才能达到道的境界,也就是无我,如果做不到就记住这些原则加以应用从而达到术的境界。

2401_84052244的博客 4363

List-ArrayList和LinkedList

用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删改查。打印顺序表i++) {}}在数组最后新增元素}}在指定位置新增元素try{}i > pos;i--) {}}}判断是否包含某个元素i++) {}}}查找某个元素对应的位置i++) {}}}获取指定位置的元素}给指定位置的元素设值}删除第一次出现的关键字}i++) {}}

weixin_44985964的博客 515

外部PLC触发VisionMaster多流程运行

上一讲,介绍了海康VisionMaster与西门子PLC1200进行S7通信。在前一讲的基础上,讲解如何通过PLC触发,实现VisionMaster的多流程运行。

haier123888的博客 4653

ArrayList 和 LinkedList 之间应该怎么选择?

Joshua Bloch:我写了 LinkedList,但我自己都不用!对,Joshua Bloch 就是 LinkedList 的作者!如果你真信了作者的话,那就真的大错特错了,LinkedList 虽然用的没有 ArrayList 多,但使用它的地方可不少。我在的引用的第三方依赖中,随便搜了一下引用,好多好多地方在用呢,比如说大名鼎鼎的 Jackson。所以,遇到一个问题,比如说:ArrayList 和 LinkedList 之间应该怎么选择?

沉默王二 1599

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ArrayList 和 LinkedList 之间的主要区别。在什么情况下你会选择使用 ArrayList 而不是 LinkedList,反之亦然?

在插入和删除元素时具有较好的性能,因为它只需要更新相邻节点的引用即可。但是,由于链表的特性,随机访问元素的成本较高,因为可能需要从头开始遍历整个链表直到找到指定位置的元素。但是,这也意味着在列表中间位置插入或删除元素的成本较高,因为这通常需要移动大量的元素。尽管它们都可以存储一系列元素,但它们在内部实现上有着显著的不同,这也决定了它们在性能上的差异。是基于双向链表实现的。每个元素实际上是一个节点,每个节点包含指向其前一个节点和后一个节点的引用。是基于动态数组实现的,它在内存中分配一块连续的空间来存储元素。

程序员学习园地。 952

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

LinkedList和ArrayList的区别

LinkedeList和ArrayList都实现了List接口,但是它们的工作原理却不一样。它们之间最主要的区别在于ArrayList是可改变大小的数组,而LinkedList是双向链接串列(doubly LinkedList)。ArrayList更受欢迎,很多场景下ArrayList比LinkedList更为适用。这篇文章中我们将会看看LinkedeList和ArrayList的不同,而且我们试

一个本科小生的奋斗史 5456

Java容器LinkedList和ArrayList的区别

LinkedeList和ArrayList都实现了List接口,但是它们的工作原理却不一样,这篇文章中我们就会看看LinkedeList和ArrayList的不同。

Felix8Bit的专栏 437

LinkedList and ArrayList

LinkedeList和ArrayList都实现了List接口,但是它们的工作原理却不一样。它们之间最主要的区别在于ArrayList是可改变大小的数组,而LinkedList是双向链接串列(doubly LinkedList)。ArrayList更受欢迎,很多场景下ArrayList比LinkedList更为适用。这篇文章中我们将会看看LinkedeList和ArrayList的不同,而且我们试

JackUltraman的博客 410

初步学习对ArrayList和LinkedList的理解

首先讲解一下ArratList,开始学习之前,如果大家对于Array数组有很好的理解相信再去理解ArrayList就容易多了。首先arraylist跟linkedlist一样都是List的实现类,arraylist的本质其实就是数组,一般使用之前先这样生成ArrayList list = new ArratList();然后可以使用add方法向里面添加元素,例如list.add(“abc”);需要...

松篁 196

vector,linkedList与arrayList区别和适用场景

List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。 3个具体实现类的相关区别如下: ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数...

程序员养成日记 630

String[]数组,ArrayList 和 LinkedList的区别

String[]数组的大小是固定的数据结构,ArrayList的大小是动态增加的数据结构,LinkedList是基于链表的数据结构 String[]数组:最高效;但是其容量固定且无法动态改变; ArrayList:容量可动态增长;但牺牲效率;ArrayList & LinkedList1. 存储方式ArrayList采用数组形式保存对象,将对象放在连续的位置。插入删除时需要重排数组中的所有数据

shaokao60的博客 864

ArrayList和LinkedList内部的实现大致是怎样的?他们之间的区别和优缺点?(Java基础知识7)

这一篇博客主要记录了ArrayList和LinkedList的学习。

qq_43110851的博客 577
上一篇: Netty对JDK做了哪些定制和优化
下一篇: 跟着实例学Go语言(一)
长三月
博客等级 码龄9年 228粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值