首页 > 其他分享 >性能篇:List集合遍历元素用哪种方式更快?

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

时间:2024-01-16 18:07:46浏览次数:27  
标签:遍历 LinkedList get 索引 ArrayList List 哪种 源码


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

ArrayList的get元素源码介绍

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

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

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

源码解析

下面是 ArrayListget方法的关键源码:

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

LinkedList的get元素源码介绍

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

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

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

源码解析

下面是 LinkedListget方法的关键源码:

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

get元素操作JMH测试

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

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

测试结论

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

通过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集合框架中的数据结构选择有所启发,有任何问题或意见,欢迎留言讨论!感谢阅读!

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

标签:遍历,LinkedList,get,索引,ArrayList,List,哪种,源码
From: https://blog.51cto.com/u_16237826/9275694

相关文章

  • P1443 马的遍历
    马的遍历题目描述有一个\(n\timesm\)的棋盘,在某个点\((x,y)\)上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。输入格式输入只有一行四个整数,分别为\(n,m,x,y\)。输出格式一个\(n\timesm\)的矩阵,代表马到达某个点最少要走几步(不能到达则输出\(-......
  • CentOS7 报错 ”Repository base is listed more than once in the configuration...
    CentOS7在使用yum时出现以下错误:RepositorybaseislistedmorethanonceintheconfigurationRepositoryupdatesislistedmorethanonceintheconfigurationRepositoryextrasislistedmorethanonceintheconfigurationRepositorycentosplusislistedmore......
  • AntDesign文件上传前端文件类型控制 不采用Upload.IGNORE来限制出现在upload_list中
    <a-form-item label="附件" :label-col="{span:4}" :wrapperCol="{span:4}" :colon="false" > <divclass="upload"> <a-upload :fileList="uploadFileList&qu......
  • delphi firemonkey使用 TListView 自定义列表数据
    设计界面如下把ListView的Item的Appearance为DynamicAppearance,并且把Item改为高度100添加Item代码procedureTForm1.Button1Click(Sender:TObject);varimg:TListItemImage;text1,text2,text3:TListItemText;beginvaritem:=ListView1.Items.Add;text......
  • Encountered fatal error while reloading routing: Routing trace file does not mat
      efinity编译在routersetup时候报错Encounteredfatalerrorwhilereloadingrouting:Routingtracefiledoesnotmatchnetlist(netlistnetcount24888v.tracenetcount0).  解决方案:检查客户工程的PNR页面。beneficialskew页面是否打开,如果是on状态,试......
  • Alist开源网盘搭建
    官网:https://alist.nn.ci/zh/github下载地址:https://github.com/alist-org/alist/releases我使用的版本:v3.29.1我的下载地址:https://wwrp.lanzout.com/iBZcC1l6x8fa1软件下载下载可能相当慢,也可能很快,这个网站时不时能打开,也可能打不开,这里不研究这个2安装使用官网......
  • 【Java 进阶篇】使用 Stream 流和 Lambda 组装复杂父子树形结构(List 集合形式)
    目录前言一、以部门结构为例1.1实体1.2返回VO1.3具体实现1.4效果展示二、以省市县结构为例2.1实体2.2返回VO2.3具体实现2.4效果展示三、文章小结前言在最近的开发中,一星期内遇到了两个类似的需求:返回组装好的部门树、返回组装好的地区信息树,最终都需要返回List集合对象给前端......
  • 非递归形式遍历二叉树
    最简单的就是前序遍历,每次将栈顶元素插入数组中。但要注意由于栈的性质,先push右节点再push左节点。点击查看代码classSolution{public:vector<int>preorderTraversal(TreeNode*root){vector<int>v;stack<TreeNode*>stk;if(root!=NULL){stk.push(root);}while(!......
  • react native 使用 FlatList 实现单选列表组件
    1.最终效果:2.实现代码:importReact,{useState}from'react';import{FlatList,SafeAreaView,StatusBar,StyleSheet,Text,TouchableOpacity,}from'react-native';constDATA=[{id:'zh_CN',title:&#......
  • [GYCTF2020]Blacklist
    [GYCTF2020]Blacklist打开题目是一个输入框,输入数字可以查看到内容用万能语句可以查看到更多东西使用联合查询发现有过滤,select这些都被过滤了show没有被过滤,所以可以查看相关信息通过师傅们的WP得知,可以用desc查看表结构的详细信息desctable_name;此处desc是describ......