面试:LinkedList 对比 ArrayList

本文深入探讨了ArrayList和LinkedList两种数据结构在Java中的特性。ArrayList基于数组,适合随机访问,但插入删除操作可能涉及大量数据移动。LinkedList采用双向链表,头尾插入删除高效,但随机访问性能较差。对于内存占用,LinkedList由于节点结构,消耗更多。在实际应用中,应根据操作场景选择合适的数据结构。
摘要由CSDN通过智能技术生成

**LinkedList**

1. 基于双向链表,无需连续内存
2. 随机访问慢(要沿着链表遍历)
3. 头尾插入删除性能高
4. 占用内存多

**ArrayList**

1. 基于数组,需要连续内存
2. 随机访问快(指根据下标访问)
3. 尾部插入、删除性能可以,其它部分插入、删除都会移动数据,因此性能会低
4. 可以利用 cpu 缓存,局部性原理

知识点1:为什么 LinkedList 随机访问慢,ArrayList 随机访问快呢?

进入 LinkedList、ArrayList 的原码看下

发现ArrayList实现了 RandomAccess 的接口,而LinkedList没有

RandomAccess翻译过来就是随机访问的意思

看下 RandomAccess 的声明,发现什么方法都没有,它就是一个标志性的接口,JDK的底层类库在实现时,会检查是否实现了RandomAccess,如果实现了,在查找其中某一元素时,就会使用下标来查找,速度快,否则使用迭代器,一个一个的查找

RandomAccess 原码也给出了例子,实现了RandomAccess,获取某个元素,根据下标直接get获取,如果没有实现,需要调用迭代器的 next() 方法才能得到下一个元素

知识点2:以前说 LinkedList 增删快,查询慢, ArrayList 增删慢,查询快,并不准确,准确来说,ArrayList 尾部插入、删除性能可以,其它部分插入、删除都会移动数据,因此性能会低;LinkedList 头、尾插入、删除性能高,中间部分性能差(因为中间插入、删除时,查找的过程,很耗时,一旦找到位置,进行插入、删除操的操作,这个过程很快)

头插入,ArrayList 比 LinkedList 慢

 尾插入,ArrayList 比 LinkedList 不相伯仲

 中间插入,LinkedList 使用了12毫秒,ArrayList使用了2毫秒,LinkedList 比 ArrayList 差很多

 由此得出结论,LinkedList 仅在头部插入时,比 ArrayList 有优势,但是 ArrayList 的平均性能比

LinkedList 强,并且LinkedList 需要使用更多的内存,因此平时的使用过程中,多数情况使用 ArrayList;

知识点3:LinkedList占用内存多

LinkedList里面由一个个的node对象组成,每个node又由元素,上指针,下指针组成,累计起来,所占内存就非常可观了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值