ArrayList 和 LinkedList 之间应该怎么选择
创始人
2024-03-03 01:13:55
0

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

相信很多人在面试时都被问过这个问题,然后一般回答: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还是保留了下来。

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...