ArrayList和LinkedList使用不当,性能差距会如此之大!下

简介: ArrayList和LinkedList使用不当,性能差距会如此之大!下

分析测试

新增元素操作性能测试

测试用例源代码:

ArrayList:https://paste.ubuntu.com/p/gktBvjgMGk/

LinkedList:https://paste.ubuntu.com/p/3jQrY2XMPr/

22a8a8ed9382b611eabed28fd9d838b.png

测试结果:

image.png

通过这组测试,我们可以知道LinkedList添加元素的效率未必要高于ArrayList。

从集合头部位置添加元素

由于ArrayList是数组实现的,在添加元素到数组头部的时候,需要对头部以后的数据进行复制重排,所以效率很低;

LinkedList是基于链表实现,在添加元素的时候,首先会通过循环查找到添加元素的位置,如果要添加的位置处于List的前半段,就从前往后找;若其位置处于后半段,就从后往前找,因此LinkedList添加元素到头部是非常高效的。

从集合中间位置位置添加元素

ArrayList在添加元素到数组中间时,同样有部分数据需要复制重排,效率也不是很高;

LinkedList将元素添加到中间位置,是添加元素最低效率的,因为靠近中间位置,在添加元素之前的循环查找是遍历元素最多的操作。

从集合尾部位置添加元素

而在添加元素到尾部的操作中,在没有扩容的情况下,ArrayList的效率要高于LinkedList。

这是因为ArrayList在添加元素到尾部的时候,不需要复制重排数据,效率非常高。

LinkedList虽然也不用循环查找元素,但LinkedList中多了new对象以及变换指针指向对象的过程,所以效率要低于ArrayList。

注意:这是排除动态扩容数组容量的情况下进行的测试,如果有动态扩容的情况,ArrayList的效率也会降低。

删除元素操作性能测试

ArrayList和LinkedList删除元素操作测试的结果和添加元素操作测试的结果很接近!

结论:如果需要在List的头部进行大量的插入、删除操作,那么直接选择LinkedList。否则,ArrayList即可。

遍历元素操作性能测试

测试用例源代码:

ArrayList:https://paste.ubuntu.com/p/ZNWc9H2pYm/

LinkedList:https://paste.ubuntu.com/p/xSk4nHDHvN/

af70bad8d62c4c897f4bc7ccadd446b.png

测试结果:

image.png我们可以看到,LinkedList的for循环性能是最差的,而ArrayList的for循环性能是最好的。

这是因为LinkedList基于链表实现的,在使用for循环的时候,每一次for循环都会去遍历半个List,所以严重影响了遍历的效率;ArrayList则是基于数组实现的,并且实现了RandomAccess接口标志,意味着ArrayList可以实现快速随机访问,所以for循环效率非常高。

LinkedList的迭代循环遍历和ArrayList的迭代循环遍历性能相当,也不会太差,所以在遍历LinkedList时,我们要切忌使用for循环遍历。

目录
相关文章
|
11天前
|
存储 测试技术 索引
ArrayList和LinkedList使用不当,性能差距会如此之大!
ArrayList和LinkedList使用不当,性能差距会如此之大!
|
1月前
|
缓存 算法 数据处理
时间&空间复杂度,Python 算法的双重考验!如何优雅地平衡两者,打造极致性能?
在Python算法中,时间与空间复杂度的平衡至关重要。时间复杂度反映算法执行时间随输入规模的变化趋势,空间复杂度则关注额外存储空间的需求。优秀的算法需兼顾两者,如线性搜索时间复杂度为O(n),空间复杂度为O(1);二分查找在时间效率上显著提升至O(log n),空间复杂度保持为O(1);动态规划通过牺牲O(n)空间换取O(n)时间内的高效计算。实际应用中,需根据具体需求权衡,如实时数据处理重视时间效率,而嵌入式系统更关注空间节约。通过不断优化,我们能在Python中找到最佳平衡点,实现高性能程序。
55 3
|
5月前
|
数据库
ArrayList的contains()方法的性能问题及优化方法
ArrayList的contains()方法的性能问题及优化方法
82 0
|
前端开发 Java 编译器
Java反射和new效率对比,差距有多大?
Java中,一般我们创建一个对象可能会选择new一下个实例。但是随着我们技术的不断提升,我们也学习到了,可以通过反射技术实现对象的创建。 可是,你有没有想一下,什么时候我们改用new创建对象,什么时候我们改用反射创建对象呢?
|
存储 安全 Go
同样作为非并发安全的数据结构,slice和map在有并发安全问题时,为什么表现相差那么大
同样作为非并发安全的数据结构,slice和map在有并发安全问题时,为什么表现相差那么大
68 0
|
存储 索引
ArrayList和LinkedList使用不当,性能差距会如此之大!上
ArrayList和LinkedList使用不当,性能差距会如此之大!上
86 0
ArrayList和LinkedList使用不当,性能差距会如此之大!上
|
存储
ArrayList和LinkedList使用不当,性能差距会如此之大!中
ArrayList和LinkedList使用不当,性能差距会如此之大!中
94 0
ArrayList和LinkedList使用不当,性能差距会如此之大!中
|
小程序
一个对提升效率有立竿见影效果的方法
这其实是上周末制定这周的计划时,额外增加的一条。因为我发现自己的工作效率与手机的解锁次数是成反比的,即在一天之内手机解锁的次数越多,那么这一天的工作效率就越差。请把这个规律结合到自己身上自查一下,对于大部分人来讲(除了有些必须通过手机开展工作业务的人)应该都是有效的。
76 0
|
安全 Java 容器
高并发下你还敢用ArrayList?过来看看CopyOnWriteArrayList吧!
高并发下你还敢用ArrayList?过来看看CopyOnWriteArrayList吧!
130 1
高并发下你还敢用ArrayList?过来看看CopyOnWriteArrayList吧!
|
监控 安全
记一次ArrayList使用不当引起的并发问题
小卷今天收到业务方反馈,调用接口有异常发生,而且随着流量增大,异常也增多了。小卷赶紧查看监控日志,发现ArrayIndexOutOfBoundsException数组越界异常变多了。于是开始进行排查。
207 0
记一次ArrayList使用不当引起的并发问题