【Java】for、forEach,Iterator在ArrayList、LinkedList上的性能比较

面对ArrayList以及LinkedList的循环遍历,使用forEach、for,Iterator谁的效率会好一些呢?


前言

日常生活中,循环遍历是少不了的,那么对于Java的几种遍历方式都很熟悉嘛?

  • 在刚接触Java的时候我们知道循环分为 for 循环、 while以及 do while循环,那么除了这三种遍历还有别的方式嘛?
  • 没错,还有forEach,慢慢地学习中我们发现,jdk1.5版本之后更新的forEach太好用了!比for、while,do while书写方面快多了!
  • 那么在效率上,哪个好点呢?
  • 本文简单的从ArrayList,LinkedList角度进行测试。

提示:这里单纯说明测试结果以及对于一些使用方式的比较说明,对于java循环讲解暂时略过

一、forEach与Iterator

1.发行时间

forEach是jdk5(jdk1.5)版本之后更新产物;Iterator则是jdk8(jdk1.8)的产物,Iterator是collection 的一个迭代器。

2.区别

  1. forEach通常用于一次性遍历整个集合,大大提升了代码的简洁性和可阅读性,但期间无法控制遍历的过程。而Iterator通过hasNext(),next() 更好地控制便利过程的每一步。
  2. forEach在遍历过程中严禁改变集合的长度,且无法对集合的删除或添加等操作。而Iterator可以在遍历过程中对集合元素进行删除操作。
  3. 在设计模式中迭代器模式搭配组合模式一起使用,可以递归方式控制树状结构的遍历。
  4. Map虽然不能使用forEach,但可以通过Map.Entry来对Map进行forEach遍历
    for(Map.Entry entry :map.entrySet()){
		  // code...
    }

二、测试

测试须知

  • 测试容器:本次是对ArrayList以及LinkedList的循环遍历
  • 测试项:forEach、for,Iterator
  • 赋值量:
    • 100000条长度为10的字符串
    • 10000000条长度为10的字符串
    • 1000条长度为10的字符串
  • 运算时间方法: 使用的是 System.nanoTime()

并不绝对,测试环境也要考虑

结果普遍如下

································here for loop······················ArrayList····················
execution time:   0.6844 ms.
································here forEach loop··················ArrayList····················
execution time:   1.9834 ms.
································here iterator loop·················ArrayList····················
execution time:   0.8786 ms.
································································································
·····After many tests, in most cases, the for the most efficiency, followed by the iterator.····
································································································
································here for loop·····················LinkedList····················
execution time:3035.3940 ms.
································here forEach loop·················LinkedList····················
execution time:   1.4215 ms.
································here iterator loop················LinkedList····················
execution time:   0.8353 ms.

↑ 在100000条数据测试中,for对于ArrayList的遍历效率略胜一筹,与iterator差不多;对于LinkedList,for效率最差,iterator最高。

································here for loop······················ArrayList····················
execution time:  56.7496 ms.
································here forEach loop··················ArrayList····················
execution time:  83.0643 ms.
································here iterator loop·················ArrayList····················
execution time:  58.5370 ms.
································································································
·····After many tests, in most cases, the for the most efficiency, followed by the iterator.····
································································································
································here for loop·····················LinkedList····················
pass for loop
execution time:   0.0060 ms.
································here forEach loop·················LinkedList····················
execution time: 694.5913 ms.
································here iterator loop················LinkedList····················
execution time: 648.3043 ms.

↑ 在10000000条数据测试中,for对于ArrayList的遍历效率略胜一筹,与iterator差不多;对于LinkedList,for效率最差直接卡死,iterator略高。

································here for loop······················ArrayList····················
execution time:   0.0275 ms.
································here forEach loop··················ArrayList····················
execution time:   0.1711 ms.
································here iterator loop·················ArrayList····················
execution time:   0.0382 ms.
································································································
·····After many tests, in most cases, the for the most efficiency, followed by the iterator.····
································································································
································here for loop·····················LinkedList····················
execution time:   1.0022 ms.
································here forEach loop·················LinkedList····················
execution time:   0.2920 ms.
································here iterator loop················LinkedList····················
execution time:   0.0428 ms.

↑ 在1000条数据测试中,for对于ArrayList的遍历效率略胜一筹,与iterator差不多;对于LinkedList,for效率最差,iterator最高。

三、总结

经过上述实验,ArrayList推荐 for , iteratorLinkedList 推荐 iterator,for循环会很慢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用ArrayListLinkedList进行遍历时,你可以使用for循环、foreach循环和Iterator迭代器三种方法来遍历集合元素。以下是示例代码: 使用for循环遍历ArrayList: ```java import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class Main { public static void main(String[] args) { List<String> arrayList = new ArrayList<>(); arrayList.add("Apple"); arrayList.add("Banana"); arrayList.add("Orange"); for (int i = 0; i < arrayList.size(); i++) { String element = arrayList.get(i); System.out.println(element); } } } ``` 使用foreach循环遍历ArrayList: ```java import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class Main { public static void main(String[] args) { List<String> arrayList = new ArrayList<>(); arrayList.add("Apple"); arrayList.add("Banana"); arrayList.add("Orange"); for (String element : arrayList) { System.out.println(element); } } } ``` 使用Iterator迭代器遍历ArrayList: ```java import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class Main { public static void main(String[] args) { List<String> arrayList = new ArrayList<>(); arrayList.add("Apple"); arrayList.add("Banana"); arrayList.add("Orange"); Iterator<String> iterator = arrayList.iterator(); while (iterator.hasNext()) { String element = iterator.next(); System.out.println(element); } } } ``` 对于LinkedList,你可以使用相同的方式进行遍历,只需将ArrayList替换为LinkedList即可。 请注意,以上示例代码仅用于说明不同遍历方法的用法,实际应用中需要根据具体情况选择合适的遍历方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值