ArraList和LinkedList区别

news/2024/11/27 13:32:47/

文章目录

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


一、结构不同

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

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

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

二、访问速度

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

源码:

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

源码:

java">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.ppmy.cn/news/1550360.html

相关文章

读《Effective Java》笔记 - 条目9

条目9&#xff1a;与try-finally 相比&#xff0c;首选 try -with -resource 什么是 try-finally&#xff1f; try-finally 是 Java 中传统的资源管理方式&#xff0c;通常用于确保资源&#xff08;如文件流、数据库连接等&#xff09;被正确关闭。 BufferedReader reader n…

android集成FFmpeg步骤以及常用命令,踩坑经历

1、入坑第一步:首先集成的库必须正确。最好是有ndk的,FFmpeg有许多个版本,我才开始接触的时候随便选了一个,一般的 方法没有问题。但是涉及到需要使用libx264等条件进行编码时,老是报错,网上搜索资料也没有人说需要ndk的支持才行。这个问题困扰了好几天,怎么试不行,最后…

uniapp跨域问题解决方案

uniapp跨域问题解决方案 引言 在使用 uni-app 本地开发 H5> 平台时&#xff0c;需要使用浏览器进行调试&#xff0c;而浏览器会有跨域的问题。比如直接通过本地IP地址去访问开发中的页面&#xff0c;同时这个页面会调一些现有的接口时&#xff0c;就面临着跨域的问题。 解决…

Spring Boot中配置Flink的资源管理

在 Spring Boot 中配置 Flink 的资源管理&#xff0c;需要遵循以下步骤&#xff1a; 添加 Flink 依赖项 在你的 pom.xml 文件中&#xff0c;添加 Flink 和 Flink-connector-kafka 的依赖项。这里以 Flink 1.14 版本为例&#xff1a; <!-- Flink dependencies --><de…

C语言解析命令行参数

原文地址&#xff1a;C语言解析命令行参数 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 C语言有一个 getopt 函数&#xff0c;可以对命令行进行解析&#xff0c;下面给出一个示例&#xff0c;用的时候可以直接copy过去修改&#xff0c;很方便…

数据结构 (11)串的基本概念

一、串的定义 1.串是由一个或者多个字符组成的有限序列&#xff0c;一般记为&#xff1a;sa1a2…an&#xff08;n≥0&#xff09;。其中&#xff0c;s是串的名称&#xff0c;用单括号括起来的字符序列是串的值&#xff1b;ai&#xff08;1≤i≤n&#xff09;可以是字母、数字或…

嵌入式linux系统中图像处理基本方法

目录 2.1 BMP图像处理 2.1.1 BMP文件格式解析 2.1.2 代码实现:将BMP文件解析为RGB格式,在LCD上显示 2.2 JPEG图像处理 2.2.1 JPEG文件格式和libjpeg编译 2.2.2 libjpeg接口函数的解析和使用 2.2.3 使用libjpeg把JPEG文件解析为RGB格式,在LCD上显示 …

数据结构初阶---复杂度

一、数据结构前言 1.数据结构与算法 数据结构(Data Structure)&#xff1a;是计算机组织、存储数据的一种方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。 算法(Algorithm)&#xff1a;就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&am…