JAVA遍历list四种方法及其效率比较

本文深入探讨了四种遍历List的主要方法:foreach、for、Iterator和带大小的循环。通过对ArrayList和LinkedList的测试,揭示了不同遍历方式的效率差异。发现对于ArrayList,直接使用get(index)最快;而LinkedList则推荐使用迭代器或foreach,尤其是在数据量较大时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

四种主要方法有:

foreach

for(Object ob : list){

}

Iterator

Iterator it = list.iterator();

while(it.hasNext()){

       Object ob = it.next();

}

loop without size

int a = list.size();

for(int i = 0; i<a; i++){

      Object o = list.get(i);

}

loop with size

for(int i = 0; i<list.size(); i++){

      Object o = list.get(i);

}

对ArrayList测试

直接用循环的方法,get(index)来获取对象,是最快的方式。而且把i<list.size()放到循环中去判断,会影响效率。

For Each的效率最差,用迭代器的效率也没有很好。但只是相对而言,其实从时间上看最多也就差几毫秒。

然而,这并不是事实的全部真相!!!

上面的测试,我们只是用了ArrayList来做为List的实现类。所以才有上面的结论。

For each其实也是用了迭代器来实现,只不过这个Iterator是Java编译器帮我们生成的,所以我们不需要再手动去编写。但是因为每次都要做类型转换检查,所以花费的时间比Iterator略长。时间复杂度和Iterator一样,也因为用了迭代器,所以速度上受了影响。不如直接get(index)快。

那为何get(index)会比较快呢?

因为ArrayList是通过动态数组来实现的,支持随机访问,所以get(index)是很快的。迭代器,其实也是通过数组名+下标来获取,而且增加了逻辑,自然会比get(index)慢。

LinkedList测试分析

跟ArrayList完全不一样了。最突出的就是get(index)的方式,随着size的增加,急剧上升。到10万数据量时,光遍历时间都要三四秒,这是很可怕的。那为何会有这样的结果呢?还是和LinkedList的实现方式有关。LinkedList是通过双向链表实现的,无法支持随机访问。当你要向一个链表取第index个元素时,它需要二分后从某一端开始找,一个一个地数才能找到该元素。这样一想,就能明白为何get(index)如此费时了。

总结

(1)对于ArrayList和size<1000的LinkedList来说,每种遍历方式差异不大;

(2)对于size较大的LinkedList,建议使用迭代器或者foreach的方式进行遍历,否则效率将会有明显的差距。

综合来看,使用foreach方法比较合适。

另外,除去效率的考虑,也应该在设计上花心思,实际上把大量的对象放入list内本身就是需要考虑的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值