Java容器---迭代器,java容器---
任何容器類,都必須有某種方式可以插入元素並將它們再次取回。畢竟,持有事物是容器最基本的工作。 對於List, add0是插入元素的方法之一,而get()是取出元素的方法之一。
如果從更高層的角度思考,會發現這裡有個缺點:要使用容器,必須對容器的確切類型編程。 初看起來這沒什麼不好,但是考慮下面的情況:如果原本是對著List編碼的, 但是後來發現如果能夠把相同的代碼應用於Set,將會顯得非常方便,此時應該怎麼做?或者打算從頭開始編寫通用的代碼, 它們只是使用容器,不知道或者說不關心容器的類型,那麼如何才能不重寫代 碼就可以應用於不同類型的容器?
迭代器(也是一種設計模式)的概念可以用於達成此目的。 迭代器是一個對象,它的工作是遍曆並選擇序列中的對象,而用戶端程式員不必知道或關心該序列底層的結構。 此外,迭代器通常被稱為輕量級對象: 建立它的代價小。 因此, 經常可以見到對迭代器有些奇怪的限制, 例如,Java的Iterator 只能單向移動,這個Iterator 只能用來:
(1)使用方法iterator()要求容器返回一個Iterator。Iterator將準備好返回序列的第一個元素。
(2)使用next()獲得序列中的下一個元素。
(3)使用hasNext()檢查序列中是否還有元素。
(4)使用remove()將選代器新近返回的元素刪除.
有了Iterator就不必為容器中元素的數量操心了,那是由hasNext()和next()關心的事情。 如果你只是向前遍曆List,並不打算修改List對象本身,那麼你可以看到foreach文法會顯得更加簡練。
Iterator還可以移除由next()產生的最後一個元素,這意味著調用remove()之前必須首先調用Next()方法。
接受對象容器並傳遞它,從而在每個對象上都執行操作,這種思想很強大。
Listlterator 是一個更加強大的Iterator的子類型,它只能用於各種List類的訪問。儘管 Iterator只能向前移動,但是Listlterator 可以雙向移動。它還可以產生相對於選代器在列表中指向的當前位置的前一個和後一個元素的索引,並且可以使用set()方法替換它訪問過的最後一個元素。你可以通過調用listlterator()方法產生一個指向List開始處的Listlterator,並且還可以通過調用listlterator(n)方法建立一個一開始就指向清單索引為n的元素處的Listlterator。
(1)Foreach 遍曆集合元素
1 public class ForeachDemo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 /* 9 * JDK1.5特性: 10 * 增強for迴圈。作用:用於遍曆Collection集合or數組。 11 * 格式: 12 * for(元素類型 變數 :Collection容器or數組) 13 * { 14 * } 15 * 16 * 傳統for迴圈和增強for迴圈有什麼區別呢? 17 * 增強for必須有被遍曆的目標。該目標只能是Collectionor數組。 18 * 19 */ 20 21 Collection coll = new ArrayList(); 22 23 coll.add("abc1"); 24 coll.add("abc2"); 25 coll.add("abc3"); 26 27 for(Object obj : coll){ 28 System.out.println(obj); 29 } 30 /* 31 for (Iterator it = coll.iterator(); it.hasNext();) { 32 Object obj = it.next(); 33 System.out.println(obj); 34 35 }*/ 36 //對於數組的遍曆,如果不操作其角標,可以使用增強for,如果要操作角標。使用傳統for。 37 int[] arr = {23,15,32,78}; 38 for(int x : arr){ 39 System.out.println("x="+x); 40 } 41 42 43 } 44 45 }(2)ListIterator遍曆List元素
1 public class ListIteratorDemo { 2 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 8 List list = new ArrayList(); 9 10 list.add("abc1"); 11 list.add("abc2"); 12 list.add("abc3"); 13 list.add("abc4"); 14 15 16 /* 17 //在遍曆的過程中,如果遍曆到abc2,添加一個元素haha 18 for (Iterator it = list.iterator(); it.hasNext();) { 19 Object obj = it.next();//java.util.ConcurrentModificationException 20 21 //迭代過程中使用了使用了集合對象同時對元素進行操作。導致了迭代的不確定性。引發了該異常。 22 //解決思想:在迭代過程中,想要執行一些操作,使用迭代器的方法就可以了。 23 24 if(obj.equals("abc2")){ 25 list.add("haha"); 26 } 27 }*/ 28 29 //使用list集合的特有的迭代器。ListIterator 通過List集合的方法listIterator()擷取該迭代器對象。 30 //ListIterator可以實現在迭代過程中的增刪改查。 31 for (ListIterator it = list.listIterator(); it.hasNext();) { 32 Object obj = it.next(); 33 34 if(obj.equals("abc2")){ 35 it.add("haha"); 36 } 37 38 } 39 40 System.out.println(list); 41 } 42 43 }
2018-01-04
內容來自傳智播客課程