一個完整的遍歷速度測試--遍歷list元素,用iterator() ,hasNext()與for的區別

import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;

/**
 * IteratorTest
 * @author SageZk
 */
public class IteratorTest {

	public static long testForloops(List<String> list) {
		long start = 0L, end = 0L;
		@SuppressWarnings("unused")
		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<String> list) {
		long start = 0L, end = 0L;
		@SuppressWarnings("unused")
		String le = null;
		start = System.nanoTime();
		Iterator<String> it = list.iterator();
		while (it.hasNext()) {
			le = it.next();
		}
		end = System.nanoTime();
		return end - start;
	}

	public static void main(String[] args) {
		//測試列表長度
		final int LEN = 10000;

		//初始化測試用數據
		List<String> arraylist = new ArrayList<String>();
		List<String> linkedlist = new LinkedList<String>();
		for (int i = 0; i < LEN; ++i) {
			String s = Integer.toString(i, 2);
			arraylist.add(s);
			linkedlist.add(s);
		}

		//打印測試結果
		final String FORMAT = "%1$-16s%2$-16s%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, "ArrayList", "Iterator", testIterator(arraylist));
		System.out.printf(FORMAT, "LinkedList", "for", testForloops(linkedlist));
		System.out.printf(FORMAT, "LinkedList", "Iterator", testIterator(linkedlist));
	}

}

以下是 3 組測試結果:

[code=BatchFile]List Type Time(nanoseconds)
-------------------------------------------------
ArrayList       for                      1189258
ArrayList       Iterator                 2365594
LinkedList      for                    152396254
LinkedList      Iterator                 2340801

List Type Time(nanoseconds)
-------------------------------------------------
ArrayList       for                      1235701
ArrayList       Iterator                 4249982
LinkedList      for                    149825606
LinkedList      Iterator                 2525531

List Type Time(nanoseconds)
-------------------------------------------------
ArrayList       for                      1198267
ArrayList       Iterator                 2584617
LinkedList      for                    150382451
LinkedList      Iterator                 2347994

[/code]


帽子大哥的總結:

使用 Iterator 的好處在於可以使用相同方式去遍歷集合(List 是有序集合)中元素,而不用考慮集合類的內部實現(只要它實現了 java.lang.Iterable 接口)。
比如樓主例子中,如果使用 Iterator 來遍歷集合中元素,一旦不再使用 List 轉而使用 TreeSet 來組織數據,那遍歷元素的代碼不用做任何修改,如果使用 for 來遍歷,那所有遍歷此集合的算法都得做相應調整。


這是在一篇問答帖子上看到的,當時覺得帽子大哥說得比較經典,故copy下來存檔了。

具體帖子地址爲:http://bbs.csdn.net/topics/250025827

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章