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循环遍历。

目录
相关文章
|
1月前
|
存储 测试技术 索引
ArrayList和LinkedList使用不当,性能差距会如此之大!
ArrayList和LinkedList使用不当,性能差距会如此之大!
|
4月前
|
缓存 Java 数据库连接
Java演进问题之指针的间接获取现在对性能的影响变得更大如何解决
Java演进问题之指针的间接获取现在对性能的影响变得更大如何解决
|
前端开发 Java 编译器
Java反射和new效率对比,差距有多大?
Java中,一般我们创建一个对象可能会选择new一下个实例。但是随着我们技术的不断提升,我们也学习到了,可以通过反射技术实现对象的创建。 可是,你有没有想一下,什么时候我们改用new创建对象,什么时候我们改用反射创建对象呢?
|
存储 安全 Go
同样作为非并发安全的数据结构,slice和map在有并发安全问题时,为什么表现相差那么大
同样作为非并发安全的数据结构,slice和map在有并发安全问题时,为什么表现相差那么大
70 0
|
缓存 NoSQL Redis
并发编程-24 高并发处理手段之扩容思路 + 缓存思路
并发编程-24 高并发处理手段之扩容思路 + 缓存思路
96 0
|
存储
ArrayList和LinkedList使用不当,性能差距会如此之大!中
ArrayList和LinkedList使用不当,性能差距会如此之大!中
100 0
ArrayList和LinkedList使用不当,性能差距会如此之大!中
|
存储 索引
ArrayList和LinkedList使用不当,性能差距会如此之大!上
ArrayList和LinkedList使用不当,性能差距会如此之大!上
88 0
ArrayList和LinkedList使用不当,性能差距会如此之大!上
|
安全 Java 容器
高并发下你还敢用ArrayList?过来看看CopyOnWriteArrayList吧!
高并发下你还敢用ArrayList?过来看看CopyOnWriteArrayList吧!
132 1
高并发下你还敢用ArrayList?过来看看CopyOnWriteArrayList吧!
|
监控 安全
记一次ArrayList使用不当引起的并发问题
小卷今天收到业务方反馈,调用接口有异常发生,而且随着流量增大,异常也增多了。小卷赶紧查看监控日志,发现ArrayIndexOutOfBoundsException数组越界异常变多了。于是开始进行排查。
209 0
记一次ArrayList使用不当引起的并发问题