ArrayList与LinkList对比

ArrayList与LinkList对比前边两篇博文简要总结了一下 ArrayList 和 LinkedList 的用法以及源码 本文简要总结一下这二者的区别 这在面试中也是常常会问到的一个知识点 先来看一下 ArrayList 和 LinkedList 的关系是怎样的 从继承体系可以看到 ArrayList 与 LinkedList 都是 Collection 接口下 List 接口的实现类 可谓是一对双胞胎 但由于底层数据结构的不同导致 Array

前边两篇博文简要总结了一下ArrayList和LinkedList的用法以及源码。本文简要总结一下这二者的区别,这在面试中也是常常会问到的一个知识点。

先来看一下ArrayList和LinkedList的关系是怎样的:

ArrayList与LinkList对比

从继承体系可以看到,ArrayList与LinkedList都是Collection接口下List接口的实现类。可谓是一对双胞胎。

但由于底层数据结构的不同导致ArrayList与LinkedList有本质上的区别。

ArrayList与LinkedList的区别

ArrayList:

 ArrayList是基于动态数组的数据结构。

因为是数组,所以ArrayList在初始化的时候,有初始大小10,插入新元素的时候,会判断是否需要扩容,扩容的步长是0.5倍原容量,扩容方式是利用数组的复制,因此有一定的开销;

另外,ArrayList在进行元素插入的时候,需要移动插入位置之后的所有元素,位置越靠前,需要位移的元素越多,开销越大,相反,插入位置越靠后的话,开销就越小了,如果在最后面进行插入,那就不需要进行位移;

LinkedList:

内部使用基于链表的数据结构实现存储,LinkedList有一个内部类作为存放元素的单元,里面有三个属性,用来存放元素本身以及前后2个单元的引用,另外LinkedList内部还有一个header属性,用来标识起始位置,LinkedList的第一个单元和最后一个单元都会指向header,因此形成了一个双向的链表结构。

LinkedList是采用双向链表实现的。所以它也具有链表的特点,每一个元素(结点)的地址不连续,通过引用找到当前结点的上一个结点和下一个结点,即插入和删除效率较高,只需要常数时间,而get和set则较为低效。

LinkedList的方法和使用和ArrayList大致相同,由于LinkedList是链表实现的,所以额外提供了在头部和尾部添加/删除元素的方法,也没有ArrayList扩容的问题了。另外,ArrayList和LinkedList都可以实现栈、队列等数据结构,但LinkedList本身实现了队列的接口,所以更推荐用LinkedList来实现队列和栈。

总而言之,ArrayList和LinkedList的区别有以下几点:

  •  ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构;
  • 对于随机访问元素,Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。ArrayList想要get(int index)元素时,直接返回index位置上的元素,而LinkedList需要通过for循环进行查找,虽然LinkedList已经在查找方法上做了优化,比如index < size / 2,则从左边开始查找,反之从右边开始查找,但是还是比ArrayList要慢。
  •  对于添加和删除操作add和remove,LinkedList是更快的。因为LinkedList不像ArrayList一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是ArrayList最坏的一种情况,时间复杂度是O(n),而LinkedList中插入或删除的时间复杂度仅为O(1)。ArrayList在插入数据时还需要更新索引(除了插入数组的尾部)。 ArrayList想要在指定位置插入或删除元素时,主要耗时的是System.arraycopy动作,会移动index后面所有的元素;LinkedList主耗时的是要先通过for循环找到index,然后直接插入或删除。这就导致了两者并非一定谁快谁慢。

适用场景

很多场景下都是ArrayList更受欢迎。但有些情况下LinkedList更为合适,比如:

1) 你的应用不会随机访问数据。因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据。

2) 你的应用有更多的插入和删除元素操作,更少的读取数据。因为插入和删除元素不涉及重排数据,所以它要比ArrayList要快。

以上就是关于ArrayList和LinkedList的差别。你需要一个不同步的基于索引的数据访问时,请尽量使用ArrayList。ArrayList很快,也很容易使用。但是要记得要给定一个合适的初始大小,尽可能的减少更改数组的大小。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/216629.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 上午11:26
下一篇 2026年3月18日 上午11:26


相关推荐

  • 查看maven版本_在Linux上快速部署Maven环境

    查看maven版本_在Linux上快速部署Maven环境一 下载压缩包官方地址 Maven DownloadApac maven apache org 直接使用 wget 命令进行下载 maven 压缩包 gt wgethttps mirrors tuna tsinghua edu cn apache maven maven 3 3 6 3 binaries apache maven 3 6 3 bin tar gz 二 解压 ta

    2026年3月17日
    2
  • 一文精通AI Agent开发:智能体构建实战指南与框架解析

    一文精通AI Agent开发:智能体构建实战指南与框架解析

    2026年3月16日
    1
  • 如何实现混合线性模型?

    如何实现混合线性模型?如何实现混合线性模型 1 基本表达式 2 数据整理形式 3 结果查看 4 随机斜率的取舍 5 调整固定因子比较基线 6 简单效应分析 7Planedcontr 广义混合线性模型 9REML 和 MLHello 这里是行上行下 我是张光耀 本文最早发布在本人的 GitHub 上 后来在 R 语言中文社区的公共号上发布过 在之后对其内容进行过几次更新 这一版为最新版 2019 年 6 月 7 日 修改了一些错误的地方 增添了新的内容 R 中混合线性模型可依靠 lme4 或者 lmerTest 数据包 强烈推荐后者 因为

    2026年3月19日
    2
  • (快速入门)保姆级详细的 Midjourney 基础教程

    (快速入门)保姆级详细的 Midjourney 基础教程

    2026年3月15日
    2
  • java swing 自由布局_java swing布局

    java swing 自由布局_java swing布局展开全部 nulllayout 不是很好 所有的东西都要自己定义 一旦窗口大小 e59b9ee7ad86 变化就要重新计算 我建议使用 MigLayout 上手慢 但很强大 http www miglayout com 而且 就算你要用内建的 LayoutManage 还有一个 GridBagLayou 比 G

    2026年3月18日
    2
  • linux将一个文件夹的内容复制到另一个文件夹_linux复制文件夹命令

    linux将一个文件夹的内容复制到另一个文件夹_linux复制文件夹命令1.前言本文主要讲解Linux系统如何使用命令行工具把文件复制到另一个文件夹或者目录。2.cp命令的选项和功能copy命令的功能是将给出的文件或目录拷贝到另一文件或目录中,同MSDOS下的copy命令一样,功能十分强大。语法:cp[选项]源文件或目录目标文件或目录说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。该命令的各选项含义如下:-a该选项通常在拷贝目录…

    2022年8月23日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号