問題:java
看老大的代碼須要取list裏面每一個元素的時候,都是
Iterator it = list.iterator();
while (it.hasNext()) {
personnelID= (String) it.next();
}
這樣比我直接寫for(int i=0;i<list.size();i++){
personnelId=(String)list.get(i);
}
有什麼優勢嗎?算法
迭代器(Iterator)設計模式
迭代器是一種設計模式,它是一個對象,它能夠遍歷並選擇序列中的對象,而開發人員不須要了解該序列的底層結構。迭代器一般被稱爲「輕量級」對象,由於建立它的代價小。oop
Java中的Iterator功能比較簡單,而且只能單向移動:測試
(1) 使用方法iterator()要求容器返回一個Iterator。第一次調用Iterator的next()方法時,它返回序列的第一個元素。注意:iterator()方法是java.lang.Iterable接口,被Collection繼承。spa
(2) 使用next()得到序列中的下一個元素。設計
(3) 使用hasNext()檢查序列中是否還有元素。code
(4) 使用remove()將迭代器新返回的元素刪除。orm
Iterator是Java迭代器最簡單的實現,爲List設計的ListIterator具備更多的功能,它能夠從兩個方向遍歷List,也能夠從List中插入和刪除元素。對象
迭代器應用:
list l = new ArrayList();
l.add("aa");
l.add("bb");
l.add("cc");
for (Iterator iter = l.iterator(); iter.hasNext();) {
String str = (String)iter.next();
System.out.println(str);
}
/*迭代器用於while循環
Iterator iter = l.iterator();
while(iter.hasNext()){
String str = (String) iter.next();
System.out.println(str);
}
上面兩個都不怎麼樣,應該使用下面的形式: List<String> arraylist = new ArrayList<String>(); for (String str:arraylist) { System.out.println(str); } 這作到了最好的封裝性.
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 來遍歷,那全部遍歷此集合的算法都得作相應調整。