用 ArrayList 还是 LinkedList?

Java中对比Vector, ArrayList, LinkedList的区别 创作不易,请大家多多支持。我们在日常的工作中,能够高效地管理和操作数据是非常重要的。由于每个编程语言支持的数据结构不尽相同,比如我最早学习的 C语言,需要自己实现很多基础数据结构,管理和操作会比较麻烦。相比之下,Java 则要方便的多,针对通用场景的需求,Java提供了强大的集合框架,大大提高了开发者的生产力。今天我要问你的是有关集合框架方面的问题,对比Vector、ArrayList、LinkedList 有何区别? 阅读详情

源码精品专栏

 

来源:dzone.com/articles/arraylist-or-linkedlist

  • 1. List 接口

  • 2. 用法

  • 3. 内部实现

    • 3.1 LinkedList 内部实现

    • 3.2 ArrayList 内部实现

  • 4. 各种操作的时空复杂性

  • 5. 小贴士

  • 6. 总结


本文旨在为 Java 开发这择合适的顺序数据结构提供指导。

ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个类。ArrayList 和 LinkedList 都实现 List 接口。首先,让我们了解一下它们最重要的父接口——List。

1. List 接口

列表(list)是元素的有序集合,也称为序列。它提供了基于元素位置的操作,有助于快速访问、添加和删除列表中特定索引位置的元素。List 接口实现了 Collection 和 Iterable 作为父接口。它允许存储重复值和空值,支持通过索引访问元素。

2. 用法

下面是使用 List 接口声明 ArrayList 和 LinkedList 的代码片段。

import java.util.*;
public class MyClass {
  // 非同步或非线程安全
  List<Object> arrayList = new ArrayList<>(); // 声明一个 array list
  List<Object> linkedList = new LinkedList(); // 声明 linked list
  // 确保线程安全
  List<Object> tsArrayList = Collections.synchronizedList(new LinkedList<>());
  List<Object> tsLinkedList = Collections.synchronizedList(new LinkedList<>());
}

Vector 与 ArrayList 类似,只是它们支持自动同步,这也使得 Vector 线程安全,但同时会带来一些性能损耗。

3. 内部实现

3.1 LinkedList 内部实现

Linkedlist 数据结构包含一组有序的数据元素,称为节点。每个元素都包含对其后续元素,即下一个元素的链接或引用。序列的最后一个元素(尾部)指向空元素。链表本身包含对链表第一个元素的引用,该元素称为 head 元素。Java 中的 LinkedList 是 List 接口的双向链表。在双向链表中,每个节点都指向它的上一个节点和下一个节点。此外,它还实现了其他接口,比如 Serializable、 Cloneable 和 Deque(实现 Queue 作为父接口)。

3.2 ArrayList 内部实现

ArrayList 是可调整大小的数组,实现了 List 接口。它的内部是一个对象数组,可以根据需要扩容支持在集合中加入更多元素。可以通过构造函数 ArrayList(int initialCapacity)指定 ArrayList 的初始容量,然后在必要时使用 void ensureCapacity(int minCapacity) 增加容量,确保至少可以容纳初始化时最小容量参数指定数量的元素。

它还提供一个方法 void trimToSize(),可以减少现有元素的大小。

// 调用构造函数 ArrayList<type>(initialCapacity)
List arr = new ArrayList<Integer>(10);

默认情况下,ArrayList 创建初始容量为10的列表,而 LinkedList 只构造一个没有设置任何初始容量的空列表。Linkedlist 不实现 RandomAccess 接口,而 ArrayList 实现了 RandomAccess 接口(而非 Deque 接口)。

4. 各种操作的时空复杂性

5. 小贴士

考虑下面遍历 LinkedList 的示例代码。在这段代码中遍历会非常慢,因为 LinkedList 不支持随机访问,因此每次遍历都会带来巨大的开销。

LinkedList ll = new LinkedList();
…
…
Object o = null;
for (int i = 0; i < list.size(); i++)
{
  o = list.get(i);
  …
}

一个更好的方法可提高性能,像下面这段代码。

LinkedList ll = new LinkedList();
…
…
Object o = null;
ListIterator li = list.listIterator(0);
while (li.hasNext()){
  o = ll.next();
  …
}

6. 总结

相比较而言 ArrayList 更快而且更好,因为它支持对其元素的随机访问。遍历链表或在中间插入新元素开销很大,因为必须遍历每个元素而且很可能遇到缓存失败。如果需要在一次迭代中对列表中的多个项目执行处理,那么 LinkedList 的开销比 ArrayList 使用时多次复制数组元素的开销要小。

欢迎分享你对这个话题的经验与见解,请在文章的评论区中提出你的想法。

ArrayList 与 LinkedList 的区别 ArrayList和LinkedList的区别主要体现在底层结构、访问性能、增删操作和内存占用上。ArrayList基于数组,内存连续,支持快速随机访问但增删效率较低;LinkedList基于双向链表,内存不连续,增删高效但访问需要遍历。ArrayList内存占用较小且能利用CPU缓存局部性原理,而LinkedList需要额外存储指针且无法有效利用缓存。具体选择取决于实际应用场景中对访问和修改操作的需求。 阅读详情

相关推荐

SIMPLIS实战:从零构建理想BUCK电路,精准计算与POP稳态分析

本文详细介绍了如何使用SIMPLIS软件从零开始构建并仿真一个理想的BUCK降压电路。通过设定关键参数、计算理想器件值,并搭建仿真模型,文章重点演示了暂态仿真以观察电路上电过程,并深入讲解了高效的POP(周期性工作点)稳态分析技术,帮助工程师快速验证设计、评估稳态性能,从而加速电源设计迭代。

weixin_29165465的博客 392

为什么推荐java程序员尽量用arrayList而不是linkedlist

由上面的测试可知,除了队列场景之外,都应该优先选择ArrayList来作为队列存储的实现。如果涉及到大量的随机插入的情况,可以考虑使用树结构。

qq_35824590的博客 829

【计算机三级-数据库技术】操作题大题(第1套)

从触发器的语法中可知,【1】处应该填写的是执行触发器的表,【2】处应该填写指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。使用FOR或AFTER选顶定义的触发器为后触发器,即只有在引发触发器执行的语句中的操作都已成功执行,并且所有的约束检查也成功完成后,才执行触发器。转换成新的独立的模式,模式的属性由联系本身的属性及两个实体的键构成,主键由两端实体的键组合而成。实体的转换:在从ER图转换为关系模式时,一个实体转换成一个关系模式,实体的属性就是关系模式的属性,实体的键就是关系的主键。

放纵小开爱的博客 1101

LinkedList 的作者:我写了 LinkedList,但我自己都不用

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

mxt51220的博客 1238

MacBook用户必看:用Homebrew一键搞定frp内网穿透(含阿里云配置模板)

本文为MacBook用户提供基于Homebrew的frp内网穿透实战指南,详细介绍了从环境准备到阿里云服务器配置的全过程。通过Homebrew一键安装frp客户端,结合阿里云配置模板,实现高效稳定的内网穿透,适用于远程开发、IoT设备调试等多种场景。

weixin_28692817的博客 321

11. TI MSPM0G3507 DMA传输实战:ADC数据自动搬运与电压采集

本文以TI MSPM0G3507为例,详细讲解了如何利用DMA(直接存储器访问)实现ADC数据的自动搬运与电压采集。通过实战演示,解放CPU资源,提升系统实时性与效率,适用于电赛备赛及嵌入式开发中的数据采集场景。

weixin_42465140的博客 131

05 - ArrayList还是LinkedList?使用不当性能差千倍

前面我们已经从源码的实现角度深入了解了 ArrayList 和 LinkedList 的实现原理以及各自的特点。如果你能充分理解这些内容,很多实际应用中的相关性能问题也就迎刃而解了。就像如果现在还有人跟你说,“ArrayList 和 LinkedList 在新增、删除元素时,LinkedList 的效率要高于 ArrayList,而在遍历的时候,ArrayList 的效率要高于 LinkedList”,你还会表示赞同吗?现在我们不妨通过几组测试来验证一下。

。 3407

BUCK电路的大信号模型与小信号模型推导

推导开关电源信号模型的核心是将非线性开关过程线性化,常用。如需具体拓扑的推导细节,可进一步说明!

创新改变世界! 1165

ArrayList(数组) 和 LinkedList(双向链表) 的区别是什么?使用ArrayList而不使用LinkedList的原因

[toc](ArrayList(数组) 和 LinkedList(双向链表) 的区别是什么?使用ArrayList而不使用LinkedList的原因)

jj89929665的博客 816

强化学习:在智能交通系统中的应用

作者:禅与计算机程序设计艺术 这篇文章将探索如何利用强化学习(RL)这一强大的机器学习方法,在智能交通系统中实现自动驾驶、优化路线规划和提高道路安全等方面的突破。RL通过让智能体与环境互动并从这些互动中学习,从而解决复杂的决策过程问题,这正是现代智能交通系统所需要的。 背景介绍 随着城市化进程的加速,交通拥堵、能源消耗和交通事

AI天才研究院 1117

Spec Kit:GitHub 官方推出的规范驱动开发工具包,让 AI 编程真正可控、高效、高质量

先明确“做什么”和“为什么”,再考虑“如何做”。它通过一系列标准化命令(如/specify/plan/implement可验证的功能规格(spec)可执行的技术方案(plan)可追溯的开发任务(tasks)高质量的实现代码(code)最终实现“规范即代码,代码即规范”的闭环。📌项目地址许可证:MIT(完全开源,欢迎贡献)Spec Kit 代表了 GitHub 对AI 原生开发(AI-Native Development)AI 不应替代开发者,而应放大开发者的意图。

lpfasd123的博客 1710

【Java编程性能调优】使用ArrayList还是LinkedList?

ArrayList 和 LinkedList 新增元素操作测试 这里基于 ArrayList 初始化容量足够,排除动态扩容数组容量的情况下进行的测试,如果有动态扩容的情况,ArrayList 的效率也会降低。 从集合头部位置新增元素 从集合中间位置新增元素 从集合尾部位置新增元素 测试结果 (花费时间): ArrayList>LinkedList ArrayList<LinkedList ArrayList<LinkedList 通过这组测试,我们可以知道 LinkedList 添

ChinaLiaoTian的博客 736

102、栅极驱动芯片选型与设计

文章摘要 本文分享了栅极驱动芯片选型与设计的实战经验。通过一次因驱动芯片选型不当导致的炸管事故,作者总结了栅极驱动芯片选型的五个关键参数:峰值驱动电流、驱动电压范围、传播延迟匹配、欠压锁定和隔离等级。文章详细分析了自举电路设计中的常见陷阱,以及栅极电阻对开关特性的影响,并强调了PCB布局布线的重要性。最后,作者提供了七条实用建议,包括避免通用型驱动芯片、关注CMTI参数、使用插件电阻等。核心观点是:栅极驱动设计需要综合考虑参数匹配、电路布局和实际调试,示波器实测波形是验证设计的唯一标准。

2401_88858637的博客 43

ArrayList 和 LinkedList 的区别

ArrayList 和 LinkedList 的区别 ArrayList基于动态数组实现的非线程安全的集合;LinkedList基于链表实现的非线程安全的集合。 对于随机index访问的get和set方法,一般ArrayList的速度要优于LinkedList。因为ArrayList直接通过数组下标直接找到元素;LinkedList要移动指针遍历每个元素直到找到为止。 新增和删除元素,一...

ConstXiong 4万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java面试:ArrayList 和 LinkedList 的区别是什么?谈谈你对ArrayList和LinkedList的理解

ArrayList是基于动态数组实现的 List,其中元素的索引是基于顺序的。它提供了按索引访问元素的快速方式,适合需要频繁读取元素的场景。ArrayList 和 LinkedList 各有优缺点,选择合适的集合类将直接影响程序的性能和可维护性。了解它们的特性及适用场景可以帮助开发者更有效地管理数据结构,从而优化应用程序的性能。希望本篇博客能够帮助你更好地理解 ArrayList 和 LinkedList,并在未来的项目中作出明智的选择!

智通全网络工作室的博客 2600

jre9下载 jdk9

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

【Java】ArrayList与LinkedList详解!!!

在集合框架中,List就是一个接口继承于Collection接口。在数据结构的角度,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删查改以及变量等操作。什么是线性表?线性表是由n个具有相同类型元素组成的有限序列。线性表是一种常见的数据结构。在逻辑上,线性表是一种线性结构,就是连续的一条直线,在物理结构上,不一定是连续的,在物理存储是,通常是以数组和链式的结构形式存储。常见的线性比表有顺序表、链表、栈、队列.......ArrayList是一个普通的类,是顺序表的一种,

2301_80543957的博客 5622

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

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

ArrayList 和LinkedList的区别比较

‌ArrayList和LinkedList的主要区别在于它们的底层数据结构、性能特点以及适用场景。‌ArrayList和LinkedList从名字分析,他们一个是Array(动态数组)的数据结构,一个时Linked(链表)的数据结构,此外,他们两个都是对List接口的实现。前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列。

A_aspectJ的博客 4567

ArrayList与LinkedList

在日常的Java开发中,ArrayList和LinkedList是我们最常使用的两种列表结构。它们虽然都实现了List接口,但在性能表现和适用场景上却有着天壤之别。这句话背后隐藏着怎样的底层逻辑?今天,我们就从源码和数据结构的角度,彻底揭开它们的神秘面纱。

2301_80272934的博客 872

JAVA中LinkedList和ArrayList的区别

1.底层数据结构ArrayList:基于动态数组,内存连续储存LinkedList:基于双向链表,节点包含前后指针​2.访问性能​ArrayList:随机访问O(1)(直接索引)LinkedList:随机访问O(n)(需遍历)3.​插入/删除性能​ArrayList:中间/头部操作O(n)(需移动元素)尾部操作O(1)(扩容时O(n))中间操作O(n)(遍历)+O(1)(修改指针)头尾操作O(1)4.​适用场景​优先ArrayList:高频随机访问/尾部操作/内存敏感场景。

imxiaoxin09的博客 1257

Java——LinkedList 和 ArrayList的全面对比讲解

你前后都有一个人,想插队的话,你只需要拉住你前面和后面的人,让他们也拉住你。:因为数据是通过链表存储的,要访问某个特定位置的元素,你需要从头(或尾)开始,逐个走过每个节点才能找到目标⚙️。因为你只需要拉住你前面和后面的人,告诉他们换一下顺序,所以插入和删除非常方便,效率高🏆。:由于每个节点除了存储数据外,还要存储指向前后节点的两个指针🧷,所以相比ArrayList,它占用的内存更多📊。:ArrayList就像是一个紧凑的货架,所有商品整齐排列,没有多余的“拉绳子”的动作,所以它更加节省空间💡。

weixin_44748929的博客 3837

ArrayList、LinkedList、Vector

数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为ArrayList 增删操作要影响数组内的其他数据的下标。

CentOS 917

ArrayList和LinkedList详解

ArrayList是Java集合框架中的一个核心类,它实现了List接口,底层基于数组实现。作为一种动态数组,ArrayList克服了Java原生数组长度固定的局限性,能够根据需要动态调整容量。基于数组实现:ArrayList内部维护了一个Object类型的数组,用于存储元素。动态扩容:当元素数量超过当前数组容量时,ArrayList会自动扩容,通常是将容量增加到原来的1.5倍。随机访问高效:由于数组支持通过索引直接访问元素,ArrayList的随机访问性能非常好,时间复杂度为O(1)。顺序存储。

weixin_56018532的博客 1266

ArrayList和LinkedList的区别:如何选择?

方法,先将 succ 的前一个节点(prev)存放到临时变量 pred 中,然后生成新的 Node 节点(newNode),并将 succ 的前一个节点变更为 newNode,如果 pred 为 null,说明插入的是队头,所以 first 为新节点;大家都知道,数组是定长的,就是说,数组一旦声明了,长度(容量)就是固定的,不能像某些东西一样伸缩自如。比如说,默认的数组大小是 10,当添加第 11 个元素的时候,数组的长度扩容了 1.5 倍,也就是 15,意味着还有 4 个内存空间是闲置的,对吧?

sunyan5211314的博客 1562

Java中ArrayList与LinkedList区别

ArrayList和LinkedList的区别(详解):(同理插入第一个元素,这里就不做描述了,如不懂的,再看一下上面的图)对于数组(即ArrayList),随机访问元素的时间复杂度为O(1),插入元素为O(n)。【圈重点啦】对于链表(即LinkedList),随机访问元素的时间复杂度为O(n);对于链表(即LinkedList),插入第一个元素和最后一个元素时,时间复杂度为O(1);当插入的是中间元素时也是O(n)。

weixin_51594609的博客 8286

Arraylist和linkedlist区别

Arraylist和linkedlist区别

北执南念的博客 1125
上一篇: Spring Cloud 开发内存占用过高解决方法
下一篇: Java 中的锁原理、锁优化、CAS、AQS 详解!
公众号-芋道源码
博客等级 码龄10年 1625粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值