ArrayList 四种遍历方式速度对比
测试代码
package com.yorkey;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.function.Executable;
import java.util.*;
public class ArrayListTest {
@Test
public void testLoopEfficiency() {
int[] loopTimes = {10_0000, 100_0000, 1000_0000};
int repeats = 20;
Random r = new Random();
List<Integer> list = new ArrayList<>();
for (int loopTime : loopTimes) {
System.out.printf("当前迭代次数:%s\n", loopTime);
list.clear();
for (int i = 0; i < loopTime; i++) {
list.add(r.nextInt());
}
doLoop(()-> {
for (int i = 0; i < list.size(); i++) {
int code = list.get(i).hashCode();
code--;
}
}, "下标访问", repeats);
doLoop(()-> {
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
int code = iterator.next().hashCode();
code--;
}
}, "迭代器", repeats);
doLoop(()-> {
for (Integer integer : list) {
int code = integer.hashCode();
code--;
}
}, "高级for循环", repeats);
doLoop(()-> {
list.forEach(e -> {
int code = e.hashCode();
code--;
});
}, "forEach", repeats);
System.out.println("========================");
}
}
private void doLoop(Executable executable, String name, int repeats) {
int total = 0;
for (int i = 1; i <= repeats; i++) {
long startTime = System.currentTimeMillis();
try {
executable.execute();
} catch (Throwable e) {
e.printStackTrace();
}
long endTime = System.currentTimeMillis();
total += endTime - startTime;
}
System.out.printf("[%d次平均] %s: %.2fms\n", repeats, name, (double) total / repeats);
}
}
测试结果
当前迭代次数:100000
[20次平均] 下标访问: 0.60ms
[20次平均] 迭代器: 0.75ms
[20次平均] 高级for循环: 0.85ms
[20次平均] forEach: 0.45ms
========================
当前迭代次数:1000000
[20次平均] 下标访问: 1.55ms
[20次平均] 迭代器: 1.70ms
[20次平均] 高级for循环: 1.60ms
[20次平均] forEach: 1.75ms
========================
当前迭代次数:10000000
[20次平均] 下标访问: 15.70ms
[20次平均] 迭代器: 17.95ms
[20次平均] 高级for循环: 16.40ms
[20次平均] forEach: 18.60ms
========================
Process finished with exit code 0