iterator遍历,循环执行过程中会进行数据锁定, 性能稍差, 同时,如果你想在寻欢过程中去掉某个元素,只能调用it.remove方法, 不能使用list.remove方法, 否则一定出现并发访问的错误.
ForEach遍历,内部调用第一种, 换汤不换药, 因此比Iterator 慢,这种循环方式还有其他限制, 不建议使用它。
size遍历内部不锁定, 效率最高, 但是当写多线程时要考虑并发操作的问题。
以下为遍历测试结果情况。
package com.··.··;
import java.util.*;
/**
* java --list的三种遍历
* 性能比较
* Created by zhaojy on 2016/12/5.
*/
public class compare {
public static void main(String args[]){
compare();
}
public static void compare() {
List<String> list = new ArrayList<>();
Set<String> set = new HashSet<>();
for(int i=0;i<100000;i++) {
list.add("a"+i);
}
long t1,t2;
t1 = System.currentTimeMillis();
for(String s : list) {
set.add(s);
}
t2 = System.currentTimeMillis();
System.out.println("forEach遍历的时间为:"+(t2-t1)+"mm");
////two
t1 = System.currentTimeMillis();
for(int i=0; i<list.size(); i++) {
set.add(list.get(i));
}
t2 = System.currentTimeMillis();
System.out.println("size遍历的时间为:"+(t2-t1)+"mm");
////three
t1 = System.currentTimeMillis();
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
set.add(iterator.next());
}
t2 = System.currentTimeMillis();
System.out.println("iterator遍历的时间为:"+(t2-t1)+"mm");
}
}
结果为:
forEach遍历的时间为:36mm
size遍历的时间为:13mm
iterator遍历的时间为:9mm