在 Java 中,我们应当坚持使用迭代器
iterator
或者forEach
循环遍历 List ,因为它俩总能根据不同的类型提供最快的遍历速度。(实际上是先有了 iterator ,然后 Java 官方为了优化代码复杂度,又推出了基于 iterator 的 forEach 循环,它俩是同一种方式的不同写法)
本文将测试ArrayList集合
与LinkedList集合
在三种循环下的遍历速度,样本容量大小为 10000 :
- for循环
- forEach循环
- iterator迭代器
测试代码范例
public class Dog {
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
list.add(i);
}
// 1
long start1 = System.currentTimeMillis();
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i));
}
long end1 = System.currentTimeMillis();
// 2
long start2 = System.currentTimeMillis();
for (Object obj : list) {
System.out.print(obj);
}
long end2 = System.currentTimeMillis();
// 3
long start3 = System.currentTimeMillis();
Iterator<Object> iterator = list.iterator();
while (iterator.hasNext()){
System.out.print(iterator.next());
}
long end3 = System.currentTimeMillis();
// 时间
System.out.println();
System.out.println("for耗时:" + (end1 - start1)+" 毫秒");
System.out.println("forEach耗时:" + (end2 - start2)+" 毫秒");
System.out.println("iterator耗时:" + (end3 - start3)+" 毫秒");
}
}
一、结果:ArrayList
for耗时:13 毫秒
forEach耗时:10 毫秒
iterator耗时:10 毫秒
二、结果:LinkedList
for耗时:67 毫秒
forEach耗时:11 毫秒
iterator耗时:11 毫秒
三、结论
可以看到,使用forEach
循环和使用iterator
迭代器的效果是一样的,实际上编译器会把 forEach 循环编译成 for + iterator 循环;同时单纯的for
循环的性能较差,所以我们应当坚持使用iterator
迭代器或者forEach
循环遍历 List。
- 编译前
List<String> list = List.of("Apple", "Orange", "Pear");
for (String s : list) {
System.out.println(s);
}
- 编译后
List<String> list = List.of("Apple", "Orange", "Pear");
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
String s = it.next();
System.out.println(s);
}