Java中List的各种循环方式对比

今天在阅读代码的时候发现一段比较难以理解的for循环,突然对List的遍历有了兴趣,于是上网看了一下,这小小的东西真有不少的技巧。 同事说遍历数组的时候,优先顺序应该是:foreach>for>while,于是针对这个进行了一个简单的测试。 以下是测试代码: [java] public static long testForloops(List list) { long start = 0L, end = 0L; @SuppressWarnings(“nused” String le = null; start = System.nanoTime(); for (int i = list.size() - 1; i >=0; –i) { le = list.get(i); } end = System.nanoTime(); return end - start; } public static long testIterator(List list) { long start = 0L, end = 0L; @SuppressWarnings(“nused”) String le = null; start = System.nanoTime(); Iterator it = list.iterator(); while (it.hasNext()) { le = it.next(); } end = System.nanoTime(); return end - start; } public static long testForIterator(List list){ long start = 0L, end = 0L; @SuppressWarnings(“unused”) String le = null; start=System.nanoTime(); for(Iterator it = list.iterator(); it.hasNext();){ le=it.next(); } end=System.nanoTime(); return end-start; } public static long testForeach(List list){ long start = 0L, end = 0L; @SuppressWarnings(“unused”) String le = null; start=System.nanoTime(); for(String str: list){ le=str; } end=System.nanoTime(); return end-start; } public static void main(String[] args) { //测试列表长度 final int LEN = 1000; //初始化测试用数据 List arraylist = new ArrayList(LEN); List linkedlist = new LinkedList(); for (int i = 0; i < LEN; ++i) { String s = Integer.toString(i, 2); arraylist.add(s); linkedlist.add(s); } //打印测试结果 final String FORMAT = “%1$-12s%2$-12s%3$16d\n”; System.out.println(“List\t\tType\t\tTime(nanoseconds)”); System.out.println(“————————————————-“); System.out.printf(FORMAT, “ArrayList”, “for”, testForloops(arraylist)); System.out.printf(FORMAT, “LinkedList”, “for”, testForloops(linkedlist)); System.out.printf(FORMAT, “Arraylist”, “foreach”, testForeach(arraylist)); System.out.printf(FORMAT, “LinkedList”, “foreach”, testForeach(linkedlist)); System.out.printf(FORMAT, “ArrayList”, “whileIterator”, testIterator(arraylist)); System.out.printf(FORMAT, “LinkedList”, “whileIterator”, testIterator(linkedlist)); System.out.printf(FORMAT, “Arraylist”, “forIterator”, testForIterator(arraylist)); System.out.printf(FORMAT, “LinkedList”, “forIterator”, testForIterator(linkedlist)); } [/java] 测试的两组结果如下,结果一: [java] List Type Time(nanoseconds) ————————————————- ArrayList for 101000 LinkedList for 907441 Arraylist foreach 630418 LinkedList foreach 366857 ArrayList whileIterator 512606 LinkedList whileIterator 520227 Arraylist forIterator 72222 LinkedList forIterator 63289 [/java] 结果二: [java] List Type Time(nanoseconds) ————————————————- ArrayList for 93269 LinkedList for 833748 Arraylist foreach 271374 LinkedList foreach 366950 ArrayList whileIterator 208049 LinkedList whileIterator 281161 Arraylist forIterator 92102 LinkedList forIterator 63695 [/java] 从这个结果我们可以发现:对于ArrayList和LinkedList,同一种循环方式有着不同的结果。这种差距尤其是在for循环中,LinkedList简直慢死了(数组再大点的话,这种差距在好几个数量级以上)。 上面的结果也告诉我们一个事实,List的迭代while循环式很慢的,基本在任何List循环中我们可以抛弃。 针对ArrayList,我们看出的结果是:ArrayList的迭代for循环最快,其次是普通的for循环,然后是foreach和迭代while循环。 针对LinkedList,我们的结果是:LinkedList的迭代for循环最快,其次是foreach和迭代while循环,最慢的是for循环。