IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> ArrayList和LinkedList的区别看这一篇就够了! -> 正文阅读

[数据结构与算法]ArrayList和LinkedList的区别看这一篇就够了!

用一句话总结ArrayList和LinkedList的区别是:ArrayList底层是数组,查询快、增删慢;LinkedList底层是链表,查询慢、增删快。

但是,任何技术的好坏都是要看场景的...而且,LinkedList增删真的快吗?

关于ArrayList和LinkedList的区别,个人认为要结合底层数据结构来看查询和增删两个操作带来的影响。

查询比较

ArrayList底层是数组,数组的存储空间是连续的,可以根据寻址方式直接找到对应的元素位置,时间复杂度是O(1)。

举个例子:在一条正规有门牌的街上,你知道第一家店是001号,那么008肯定就在第8间,你直接过去就好了。啪一下,很快啊!

但LinkedList底层是链表,存储空间不连续,需要通过指针关联,在查询过程中需要不断跳转新的地址。

举个例子,可能不准确:你想要找一家网红店,结果到了店里,店员告诉你找错了,这是分店3号,并给了你总店的地址,你开车到了总店,结果经理又告诉你业务扩张太快了,这家已经不是总店了,总店在xx路100号...

这就是ArrayList比LinkedList查询快的原因。

增删比较

我们都知道Java原生的数组是不能扩容的,如果我初始化时申请5个元素空间,那么就至多能存5个元素,不会因为我长得帅就包容一些。

ArrayList底层也是数组,但人家支持动态扩容,所以ArrayList人称“动态数组”。什么意思呢?

假设你原始容量为4,那么插入新元素时就会触发扩容,一定几率还会触发元素拷贝,而数组扩容和元素拷贝是耗时操作,这也是ArrayList被喷增删慢的原因。但是,ArrayList增删元素必然会触发扩容和拷贝吗?NO:

插入同理,空间足够时,尾部插入不涉及元素拷贝

那么LinkedList在增删的表现如何呢?理想情况下,链表的增删操作时间复杂度确实为O(1):

我虽然没有像计算机科班的同学那样系统学过数据结构与算法,但是所谓的链表时间复杂度是O(1)是有前提的:你必须先找到元素要插入或删除的位置!就好比你要拆除某一间房子,你必须先找到那一间房子呀!

JDK源码论证

LinkedList的查询相对ArrayList慢一些,这个没有疑问,那么两者增删效率如何呢?

当前得到的信息是:

  • LinkedList查询慢
  • LinkedList增删快
  • 要增删,必须先找到元素位置,所以增删必然伴随着链表遍历

所以LinkedList增删的效率是综合的结果。最后一句话,可以在LinkedList的API中找到论证:

底层需要根据节点指针遍历,时间复杂度O(N)

而反观ArrayList的get(index):

ArrayList的get操作直接根据数组下标得到元素,底层是寻址,不用遍历,时间复杂度O(1)

总的来说就是:

ArrayList:查询O(1),增删可能涉及数组扩容和拷贝(不是100%)

LinkedList:查询O(N),增删O(1),但增删要先找到元素位置

如果ArrayList初始化时分配恰当的容量,可以避免频繁的扩容和拷贝,甚至不用扩容和拷贝。如果你有兴趣自己动手试验一下,会发现其实除了头插入和头删除,LinkedList几乎完败。

本文就是ArrayList和LinkedList的区别总结,希望对大家有帮助哈~~

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-14 23:11:55  更:2021-07-14 23:14:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/8 9:54:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码