全文目录:
开篇语
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
嘿,程序员小伙伴们,你是不是也有过这种纠结?
写集合代码的时候,脑子一热敲了个new ArrayList<>()
,结果运行时性能拉胯;又或者心血来潮换成了LinkedList
,结果内存飙升,程序直接挂掉。
到底什么时候该用ArrayList?什么时候该宠幸LinkedList?
今天,我就用人话,带着点吐槽味儿,跟你掰开揉碎地聊聊这俩好兄弟!
前言:都是List,差这么大?
从表面上看,ArrayList
和LinkedList
都实现了List
接口,方法名字也都差不多,增删改查(CRUD)一应俱全。
那为啥Java官方和各路大佬还要天天在面试、开发、优化中纠结二者的取舍呢?
因为——它们的底层结构、操作复杂度、使用场景根本不一样!
不搞清楚,迟早掉坑里。别问我怎么知道的,血泪教训呐!😭
一、底层结构揭秘:骨子里的不同
ArrayList:动态数组
- 底层:用数组(
Object[] elementData
)实现的。 - 特点:
- 元素连续存储;
- 支持随机访问,查询超快(O(1));
- 插入、删除(特别是中间位置)比较慢,因为要挪动元素。
LinkedList:双向链表
- 底层:每个元素是一个
Node
节点,节点里包含prev
(前指针)、next
(后指针)和数据本体。 - 特点:
- 元素分散存储;
- 查询慢,需要从头或者尾巴开始,一个一个找(O(n));
- 插入、删除快,只需要改指针。
🌟 直白点说:
谁 | 就像 | 特长 |
---|---|---|
ArrayList | 整齐排列的书架 | 取书快,搬书累 |
LinkedList | 手拉手排队的人 | 找人慢,插人容易 |
二、性能大比拼(增删改查)
为了让你秒懂,我直接给你上个超实用总结表:
操作 | ArrayList | LinkedList |
---|---|---|
随机访问(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只存元素本身,外加少量扩容时浪费的空间。
所以总体来说:
ArrayList | LinkedList | |
---|---|---|
内存使用 | 较省 | 较费 |
如果你的程序对内存极度敏感(比如移动端开发、嵌入式开发),还是谨慎用LinkedList吧。
五、总结:到底什么时候选谁?
场景 | 推荐 |
---|---|
经常随机访问元素 | ArrayList |
大量插入、删除操作(特别是中间位置) | LinkedList |
数据量小,对性能要求不高 | 随便(但默认ArrayList) |
内存有限,需节约空间 | ArrayList |
📣 万能口诀送你:
“查找用Array,插入靠Link,内存扛不住,再三思而行!”
小尾巴 🎵
到这里,你还会迷茫“ArrayList和LinkedList到底选谁?”吗?
其实,框架选型从来就不是死记硬背,而是要理解底层结构、时间复杂度和实际场景,然后灵活应对。
就像谈恋爱一样,适合自己的才是最好的!
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!