性能篇:List集合遍历元素用哪种方式更快?

嗨大家好,我是小米!今天给大家分享一篇关于Java集合框架性能的文章,话题是:"如果让你使用 for 循环以及迭代循环遍历一个 ArrayList,你会使用哪种方式呢?原因是什么?LinkedList呢?"废话不多说,让我们直入主题!

ArrayList的get元素源码介绍

ArrayList,作为Java集合框架中的一个重要类,是基于数组实现的动态数组。其get方法是用于获取指定索引位置的元素。让我们深入挖掘这个方法的源码。

在ArrayList的get 方法中,首先通过rangeCheck(index) 方法来检查索引是否越界。这是为了确保用户传入的索引在合法范围内。一旦索引通过了检查,便直接通过elementDataindex 来获取对应位置的元素。这一过程是非常高效的,因为底层数据结构是一个数组,通过索引直接访问元素的时间复杂度是O(1)。

这种直接访问的机制使得ArrayList在读取元素时具有较好的性能表现,尤其是当我们需要按索引随机访问元素时。数组的随机访问特性使得ArrayList在元素检索上迅速而高效。

源码解析

下面是 ArrayList 的get方法的关键源码:

LinkedList的get元素源码介绍

LinkedList是Java集合框架中基于双向链表实现的动态列表,它的get方法用于获取指定索引位置的元素。让我们深入探讨这个方法的源码。

在LinkedList的get 方法中,首先通过checkElementIndex(index) 方法来检查传入的索引是否合法。这是为了确保用户传入的索引在链表的有效范围内,防止发生越界访问。一旦索引通过了检查,接下来调用node(index) 方法获取对应位置的节点。

node(index) 方法的作用是从链表的头节点或尾节点出发,根据索引逐步遍历链表,直到找到目标位置的节点。这一过程需要遍历链表,因此时间复杂度是O(n)。一旦找到目标节点,通过node(index).item来获取节点中存储的元素。

源码解析

下面是 LinkedList 的get方法的关键源码:

get元素操作JMH测试

为了更直观地比较两者的性能,我们使用JMH(Java Microbenchmarking Harness)进行测试。以下是测试代码片段:

测试结论

通过JMH测试,我们可以看到,LinkedList 的 for 循环性能是最差的,而 ArrayList 的 for 循环性能是最好的。

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

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

END

在本文中,我们深入探讨了Java集合框架中ArrayList和LinkedList两个重要的数据结构在get元素操作上的差异。通过分析源码,我们了解到ArrayList通过数组实现,具有直接访问元素的优势,而LinkedList则通过链表实现,需要遍历节点。进而,我们通过JMH性能测试量化了它们在具体应用场景中的性能表现,帮助开发者根据需求做出合理的选择。

这篇文章旨在帮助读者更深入理解这两种数据结构的底层实现和性能特点,为实际项目中的选择提供了指导。希望本文对大家在Java集合框架中的数据结构选择有所启发,有任何问题或意见,欢迎留言讨论!感谢阅读!

如有疑问或者更多的技术分享,欢迎关注我的微信公众号"知其然亦知其所以然"!

相关推荐
Jmyd01233 小时前
Web端3D营销展厅技术实现路径:从素材上云到线索回流的数据链路
前端·3d·性能优化·三维数字化
哦虎!3 小时前
【JavaEE】网络初识
java
for_ever_love__3 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
大鸡腿同学4 小时前
手心向上,手心向下
后端
我是人✓4 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
欣栀♡4 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
CCblandy5 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
IT研究室5 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项5 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友