ArrayList vs LinkedList:到底谁才是你的“梦中情链”?

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

嘿,程序员小伙伴们,你是不是也有过这种纠结?
写集合代码的时候,脑子一热敲了个new ArrayList<>(),结果运行时性能拉胯;又或者心血来潮换成了LinkedList,结果内存飙升,程序直接挂掉。
到底什么时候该用ArrayList?什么时候该宠幸LinkedList?
今天,我就用人话,带着点吐槽味儿,跟你掰开揉碎地聊聊这俩好兄弟!


前言:都是List,差这么大?

从表面上看,ArrayListLinkedList都实现了List接口,方法名字也都差不多,增删改查(CRUD)一应俱全。
  那为啥Java官方和各路大佬还要天天在面试、开发、优化中纠结二者的取舍呢?

因为——它们的底层结构、操作复杂度、使用场景根本不一样!
不搞清楚,迟早掉坑里。别问我怎么知道的,血泪教训呐!😭


一、底层结构揭秘:骨子里的不同

ArrayList:动态数组

  • 底层:用数组(Object[] elementData)实现的。
  • 特点
    • 元素连续存储
    • 支持随机访问,查询超快(O(1));
    • 插入、删除(特别是中间位置)比较慢,因为要挪动元素

LinkedList:双向链表

  • 底层:每个元素是一个Node节点,节点里包含prev(前指针)、next(后指针)和数据本体。
  • 特点
    • 元素分散存储
    • 查询慢,需要从头或者尾巴开始,一个一个找(O(n));
    • 插入、删除快,只需要改指针

🌟 直白点说

就像特长
ArrayList整齐排列的书架取书快,搬书累
LinkedList手拉手排队的人找人慢,插人容易

二、性能大比拼(增删改查)

为了让你秒懂,我直接给你上个超实用总结表:

操作ArrayListLinkedList
随机访问(get/set)快(O(1))慢(O(n))
尾部添加(add)快(摊还O(1))快(O(1))
中间插入/删除慢(O(n))快(O(1),但找位置是O(n))
内存消耗较少(只存元素)较多(存元素+两个指针)

是不是瞬间清晰了?👏


三、实际代码演练一下!

光说不练假把式,来,咱们撸两段代码,看谁表现更优雅~

1. 查询速度对比

// 创建含有100000个元素的List
List<Integer> arrayList = new ArrayList<>();
List<Integer> linkedList = new LinkedList<>();

for (int i = 0; i < 100000; i++) {
    arrayList.add(i);
    linkedList.add(i);
}

// 随机访问测试
long startTime = System.nanoTime();
arrayList.get(50000);
long endTime = System.nanoTime();
System.out.println("ArrayList查询耗时:" + (endTime - startTime) + "ns");

startTime = System.nanoTime();
linkedList.get(50000);
endTime = System.nanoTime();
System.out.println("LinkedList查询耗时:" + (endTime - startTime) + "ns");

运行结果(大概率是这样哈):

ArrayList查询耗时:200ns
LinkedList查询耗时:150000ns

💥 结论:查询?选ArrayList,不用想!


2. 插入速度对比(中间插入)

// 中间插入元素
startTime = System.nanoTime();
arrayList.add(50000, 99999);
endTime = System.nanoTime();
System.out.println("ArrayList插入耗时:" + (endTime - startTime) + "ns");

startTime = System.nanoTime();
linkedList.add(50000, 99999);
endTime = System.nanoTime();
System.out.println("LinkedList插入耗时:" + (endTime - startTime) + "ns");

运行结果(也大致如此):

ArrayList插入耗时:80000ns
LinkedList插入耗时:5000ns

💥 结论:插入/删除?选LinkedList,爽歪歪!


四、内存开销谁更大?

这里就得说点硬核知识了,LinkedList里每个Node节点大概占:

  • 元素本身的大小 +
  • 8字节(前驱指针) +
  • 8字节(后继指针)

而ArrayList只存元素本身,外加少量扩容时浪费的空间。

所以总体来说:

ArrayListLinkedList
内存使用较省较费

如果你的程序对内存极度敏感(比如移动端开发、嵌入式开发),还是谨慎用LinkedList吧。


五、总结:到底什么时候选谁?

场景推荐
经常随机访问元素ArrayList
大量插入、删除操作(特别是中间位置)LinkedList
数据量小,对性能要求不高随便(但默认ArrayList)
内存有限,需节约空间ArrayList

📣 万能口诀送你:

“查找用Array,插入靠Link,内存扛不住,再三思而行!”


小尾巴 🎵

到这里,你还会迷茫“ArrayList和LinkedList到底选谁?”吗?
其实,框架选型从来就不是死记硬背,而是要理解底层结构时间复杂度实际场景,然后灵活应对。
就像谈恋爱一样,适合自己的才是最好的!

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值