Java中关于ArrayList和LinkedList遍历效率

Java中经常会使用List进行遍历,随着数据量不断增大,遍历很大数据的时候,发现执行效率炸了,灰常慢,翻了日志,发现在遍历数据List中巨慢,一直在循环。

查了下资料,测试了下两种LinkedList,ArrayList方式。

开始遍历100万条数据,分别使用迭代器Iterator,foreach,for方式进行遍历。

首先对LinkedList进行三种方式遍历.

结果如下:

此时会发现foreach和迭代器效率相近,foreach所需遍历时间最短,而for循环效率非常低。

之后对ArrayList进行三种方式的遍历.

结果如下:

结果表明,三种方式下,for循环遍历时间最少,而迭代器遍历最慢。


ArrayList底层实现是数组object,而LinkedList底层实现是双向链表(JDK1.7开始)。

故ArrayList具有随机访问的特性,实现了RandomAccess接口,查找的效率高。缺点就是插入和删除元素效率低,若是插入末端时间复杂度为O(1),若插入在数组中间i位置(1<i<n),则后续元素需要移动(n-i)次,时间复杂度为O(n)。由于数组连续存储,内存空间占用小,但是ArrayList需要在尾部留一部分空间。

而LinkedList底层实现为双向链表,双向链表单节点结构为指向前驱节点的指针、Data、指向后驱节点的指针,故内存空间占用比数组大。链表具有插入、删除方便的特征,只需将指针断开重定向即可,时间复杂度近乎为O(1)。但是查找方面由于是双向链表平均查找时间都为(n/2),故时间复杂度为O(n)。


结论:

实现RandomAccess接口的List,一般推荐for循环进行遍历,效率高。

而普通的不支持随机访问的,最好使用迭代器进行遍历或者foreach(底层对于List也是用迭代器实现)。对于大数据量的遍历,一定不能用for循环,不然效率特别低,基本上就废了。


小白一个,慢慢积累优化?,还是技术太渣了。






转载于:https://juejin.im/post/5c305444f265da61483bc080

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值