ArraList和LinkedList区别

文章目录

  • 一、结构不同
  • 二、访问速度
  • 三、插入和删除操作的不同
    • 1、决定效率有两个因素:数据量和位置。
    • 2、普遍说法是“LinkedList添加删除快”,这里是有前提条件的
  • 四、内存占用情况
  • 五、使用场景
  • 六、总结


一、结构不同

LinkedList:它基于双向链表。每个元素(我们叫它节点)不仅存储数据,还存储了指向前后元素的两个指针。

ArrayList:它基于动态数组。这意味着它需要一段连续的内存来存储数据📦,而不是像LinkedList那样通过指针相互连接。每个元素都通过索引快速访问

如下图所示:
在这里插入图片描述

二、访问速度

LinkedList:因为数据是通过链表存储的,要访问某个特定位置的元素,你需要从头(或尾)开始,逐个走过每个节点才能找到目标。这个过程就像翻找一个很长的链子,一环一环地往下走,所以速度会很慢。

源码:

public E get(int index) {checkElementIndex(index);return node(index).item;
}Node<E> node(int index) {if (index < (size >> 1)) {Node<E> x = first;//循环遍历链表找到对应的节点for (int i = 0; i < index; i++){x = x.next;return x;} else {Node<E> x = last;for (int i = size - 1; i > index; i--){x = x.prev;return x;}}
}

ArrayList:因为数组是连续存储的,所有元素的内存地址是连续的。所以,你可以直接通过索引来快速访问某个元素,就像一份清单,上面标明每个商品在超市里的具体位置。

源码:

public E get(int index) {rangeCheck(index);return elementData(index);
}//直接反回对应数组下表数据
E elementData(int index) {return (E) elementData[index];
}

三、插入和删除操作的不同

LinkedList:因为它是链表结构,插入和删除操作非常方便,特别是在头部或尾部插入和删除元素的时候。你只需要调整前后节点的指针指向,几乎不会影响其他节点。然而在中间位置进行操作,你还得从头开始找这个位置(通过for循环找到下标,浪费时间)。

ArrayList:在末尾插入是比较快的,因为只需要将新元素放在最后一个位置。但是如果你想在中间插入或删除元素,所有后面的元素都要往前或往后移位,浪费时间。

1、决定效率有两个因素:数据量和位置。

  • 数据量较小时,没有明显区别
  • 数据量较大时,大约在数据量的十分之一时,LinkedList就没有明显优势
  • 后半段插入时,LinkedList效率明显低于ArrayList,数据量越大越明显

2、普遍说法是“LinkedList添加删除快”,这里是有前提条件的

  • 往集合中间插入数据时ArrayList比linkedList慢
  • ArrayList正好扩容的时候添加数据要比LinkedList慢在这里插入图片描述

四、内存占用情况

LinkedList:由于每个节点除了存储数据外,还要存储指向前后节点的两个指针🧷,所以相比ArrayList,它占用的内存更多。

ArrayList:它只需要存储数据本身,没有额外的指针开销。虽然在增长时可能需要重新分配内存空间,但通常内存占用相对较少。

五、使用场景

LinkedList:适用于需要频繁插入和删除元素的场景,尤其是在队列的头部和尾部操作时⏩。比如:当你需要模拟一列排队系统时👥,LinkedList非常合适。

ArrayList:适用于快速访问数据的场景,尤其是频繁通过索引来读取数据的情况📑。如果你经常要遍历和访问元素,比如展示商品列表🛒,ArrayList会表现得更好。

六、总结

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

B站狂神说Mybatis+Spring+SpringMVC整合理解(ssm框架整合)

文章目录 0.写在前面(对mybatis,spring的理解)&#xff08;不看可跳过&#xff09;0.1 为什么需要mybatis0.2 为什么需要spring0.3为什么需要springmvc 1.新建ssmbuild数据库2.新建Maven项目3.初始化步骤3.1 配置下载maven依赖&#xff0c;构建资源导出3.2 连接数据库3.3建包&a…

Java抛出自定义运行运行

1.重新生成异常的.java文件 Empty&#xff1a;空 Exception&#xff1a;异常 加起来就是 空指针异常的文件 2.打上extends 运行的异常&#xff08;异常的类型&#xff09; 3.点击ctrlo&#xff0c;选着这两个快捷重写 4.在需要抛出异常的地方写上&#xff1a;th…

项目二技巧一

目录 nginx实现根据域名来访问不同的ip端口 配置Maven私服 快照版和发布版的区别 快照版本&#xff08;Snapshot&#xff09; 发布版本&#xff08;Release&#xff09; 导入发布版的父工程 理清楚授权规则 一.首先浏览器发送/manager/**路径请求 第二步&#xff1a;构造…

简单获取json预览

data: JSON 数据。 collapsedNodeLength: 对象或数组的长度超过此阈值时会折叠 deep: json路径深度超过此值时会折叠 showLineNumber: 显示左侧行号 showIcon: 显示图标。 virtual: 使用虚拟滚动 height: 使用虚拟滚动时列表的高度 itemHeight: 使用虚拟滚动时节点的高…

使用zabbix监控k8s

一、 参考文献 小阿轩yx-案例&#xff1a;Zabbix监控kubernetes云原生环境 手把手教你实现zabbix对Kubernetes的监控 二、部署经验 关于zabbix监控k8s&#xff0c;总体来说是分为两块内容&#xff0c;一是在k8s集群部署zabbix-agent和zabbix- proxy。二是在zabbix进行配置。…

第三方Express 路由和路由中间件

文章目录 1、Express 应用使用回调函数的参数&#xff1a; request 和 response 对象来处理请求和响应的数据。2、Express路由1.路由方法2.路由路径3.路由处理程序 3. 模块化路由4. Express中间件1.中间件简介2.中间件分类3.自定义中间件 1、Express 应用使用回调函数的参数&am…

港科夜闻 |香港科大推出 InvestLM生成式人工智能平台,支持金融中小企应用AI技术潜力...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大推出 InvestLM生成式人工智能平台&#xff0c;支持金融中小企应用AI技术潜力。香港科大商学院继去年研究团队成功开发本港首个专为金融界而设、应用于生成式人工智能(生成式AI)的开源大语言模型InvestLM后&#…

[OpenHarmony5.0][Docker][环境]OpenHarmony5.0 Docker pull线上镜像方式构建编译环境

T. 已测试目录 主机类型主机版本Docker镜像版本结果WSL2Ubuntu22.04Ubuntu20.04PASSWSL2Ubuntu22.04Ubuntu18.04PASS R. 软硬件要求&#xff1a; 硬件&#xff1a; 设备容量备注硬盘>500G多版本系统测试&#xff0c;必须固态&#xff0c;否则编译卡死硬盘>300G单系统…

Git 快速入门:全面了解与安装步骤

Git 快速入门&#xff1a;全面了解与安装步骤 一、关于Git 1.1 简介 Git 是一个开源的分布式版本控制系统&#xff0c;由 Linus Torvalds 于 2005 年创建&#xff0c;最初是为了更好地管理 Linux 内核开发而设计。 Git用于跟踪计算机文件的变化&#xff0c;特别是源代码文件…

基于Java Springboot奶茶点餐微信小程序

一、作品包含 源码数据库万字文档全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA,微信开发者工具 数据…

vulnhub靶场【哈利波特】三部曲之Fawkes

前言 这次的靶机与前面不同&#xff0c;这里涉及到缓冲区溢出等 这个靶机也让我知道薄弱点了&#xff0c;缓冲溢出这方面之前接触少&#xff0c;所以刚拿到这个靶机打开后&#xff0c;人蒙了&#xff0c;在网上查阅好多资料&#xff0c;也只是浅学一下&#xff0c;这里主要也是…

神经网络中常见的激活函数Sigmoid、Tanh和ReLU

激活函数在神经网络中起着至关重要的作用&#xff0c;它们决定了神经元的输出是否应该被激活以及如何非线性地转换输入信号。不同的激活函数适用于不同的场景&#xff0c;选择合适的激活函数可以显著影响模型的性能和训练效率。以下是三种常见的激活函数&#xff1a;Sigmoid、T…

基于Java Springboot蛋糕订购小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

<项目代码>YOLOv8 红绿灯识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

ProtonBase 教育行业解决方案

01/方案概述 当前&#xff0c;大数据、云计算等技术正加速教育行业的数字化转型&#xff0c;教学模式从线下转向线上&#xff0c;传统教育企业向具有互联网性质的新型教育企业转变。在此背景下&#xff0c;教育企业亟需探索多源数据的融合扩展&#xff0c;以应对复杂的业务场景…

Mybatis:CRUD数据操作之删除一行数据

Mybatis基础环境准备请看&#xff1a;Mybatis基础环境准备 本篇讲解Mybati数据CRUD数据操作之单条删除数据 当用户点击了该按钮&#xff0c;就会将改行数据删除掉。那我们就需要思考&#xff0c;这种删除是根据什么进行删除呢&#xff1f;是通过主键id删除&#xff0c;因为id是…

力扣1382:将二叉搜索树便平衡

给你一棵二叉搜索树&#xff0c;请你返回一棵 平衡后 的二叉搜索树&#xff0c;新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法&#xff0c;请你返回任意一种。 如果一棵二叉搜索树中&#xff0c;每个节点的两棵子树高度差不超过 1 &#xff0c;我们就称这棵二…

架构01-演进中的架构

零、文章目录 架构01-演进中的架构 1、原始分布式时代&#xff1a;Unix设计哲学下的服务探索 &#xff08;1&#xff09;背景 时间&#xff1a;20世纪70年代末到80年代初计算机硬件&#xff1a;16位寻址能力、不足5MHz时钟频率的处理器、128KB左右的内存转型&#xff1a;从…

MySQL —— MySQL 程序

目录 前言 一、MySQL 程序简介 二、mysqld -- MySQL 服务器 三、mysql -- MySQL 客户端 1. mysql 客户端简介 2. mysql 客户端选项 &#xff08;1&#xff09;指定选项的方式 &#xff08;2&#xff09;mysql 客户端命令常用选项 &#xff08;3&#xff09;在命令行中使…

GoogleTest做单元测试

目录 环境准备GoogleTest 环境准备 git clone https://github.com/google/googletest.git说cmkae版本过低了&#xff0c;解决方法 进到googletest中 cmake CMakeLists.txt make sudo make installls /usr/local/lib存在以下文件说明安装成功 中间出了个问题就是&#xff0c;…