经过实际多种场景测试,Java遍历方法的性能比较:
普通循环 :28ms
Iterator :26ms
增强for循环 :27ms
forEach :64ms
stream().forEach :24ms
parallelStream().forEach :33ms
//下面测试代码,欢迎大家找茬;
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
//List<Integer> list = new LinkedList<>();
//n越大,parallelStream性能越好
int n = 10000000;
while (n > 0) {
list.add(n);
n--;
}
test1(list); //普通循环
test2(list); //Iterator
test3(list); //增强for循环
test4(list); //forEach
test5(list); //stream().forEach
test6(list); //parallelStream().forEach
}
public static void test1(List<Integer> list) {
long before = System.currentTimeMillis();
int j = list.size();
for (int i = 0; i < j; i++) {
dosomething(list.get(i));
}
long after = System.currentTimeMillis();
System.out.println("普通循环 :" + (after - before) + "ms");
}
public static void test2(List<Integer> list) {
long before = System.currentTimeMillis();
for (Iterator<Integer> iterator = list.iterator(); iterator.hasNext();) {
int item = iterator.next();
dosomething(item);
}
long after = System.currentTimeMillis();
System.out.println("Iterator :" + (after - before) + "ms");
}
public static void test3(List<Integer> list) {
long before = System.currentTimeMillis();
for (int i : list) {
dosomething(i);
}
long after = System.currentTimeMillis();
System.out.println("增强for循环 :" + (after - before) + "ms");
}
public static void test4(List<Integer> list) {
long before = System.currentTimeMillis();
list.forEach(item -> dosomething(item));
long after = System.currentTimeMillis();
System.out.println("forEach :" + (after - before) + "ms");
}
public static void test5(List<Integer> list) {
long before = System.currentTimeMillis();
list.stream().forEach(item -> dosomething(item));
long after = System.currentTimeMillis();
System.out.println("stream().forEach :" + (after - before) + "ms");
}
public static void test6(List<Integer> list) {
long before = System.currentTimeMillis();
list.parallelStream().forEach(item -> dosomething(item));
long after = System.currentTimeMillis();
System.out.println("parallelStream().forEach:" + (after - before) + "ms");
}
public static void dosomething(int i) {
int x = i;
while (x < Integer.MAX_VALUE) {
x++;
int a = x % 2;
}
}