2011-03-31 33 views
3

可能重複:
What are the Advantages of Enhanced for loop and Iterator in Java ?
Is there a performance difference between a for loop and a for-each loop?迭代器與循環以及爲什麼迭代器是作爲循環引入的?

下面的代碼顯示了與兩個for循環以及與迭代器,我們可以遍歷集合中的元素則是做什麼用的區別循環和迭代器,以及爲什麼我們應該只使用迭代器的情況下收集

ArrayList<String> list=new ArrayList<String>(); 
    list.add("dipu"); 
    list.add("alok"); 
    list.add("alok"); 
    list.add("jyoti"); 
    ArrayList<Integer> al=new ArrayList<Integer>(); 
    al.add(1); 
    al.add(2); 
    String a[]={"a","b"}; 
    for(int i=0;i<list.size();i++) 
    { 
     System.out.println(list.get(i));; 
    } 
    for(Integer t:al) 
    { 
     System.out.println(t); 
    } 
    for (Iterator iter = list.iterator(); iter.hasNext();) 
     { 
     System.out.println(iter.next()); 
     } 
    Iterator it=list.iterator(); 
    while(it.hasNext()) 
    { 
    String st=it.next().toString(); 
    System.out.println(st); 
    } 
+0

增強的for循環的速度比正常的循環訪問元素正常一點,但不是基於陣列的集合,因爲他們可以立即訪問與輕鬆 – Kurru 2011-03-31 18:50:12

回答

1

迭代器通常更安全我會說,沒有訪問索引的風險不存在。它們也具有更多的靈活性,因爲您可以隨着它們前後移動,而for循環只有一種方式,並且在多種語言中,您不能更改循環內循環索引的值(即無法更改增量率)。

它們也是在迭代中從集合中移除項目的唯一方法。當你在for循環中刪除某個項目時,這將是災難性的,並且通常甚至不被Java允許,我忘記了什麼是異常,但是我之前已經有了一個。

想一想,一旦你刪除了項目,所有其他的項目下移。同時在您的下一次迭代中,您的索引仍然增加意味着2件事。

首先,您將跳過下一個元素,因爲它已經轉移到剛刪除的位置。

其次是你的循環將超出你現在改變的集合的大小。

+0

索引我還沒有在Java中試過,但我知道您可以使用其他語言的for循環修改數組。只要您爲您插入/移除的項目增加/減少索引變量,並在每次循環迭代中重新計算數組的長度,則不會有任何問題 – 2011-03-31 18:42:35

+0

您可以在正常for循環中編輯列表。不在迭代器中。如果你從列表中刪除一個項目,他們通常會失敗 – Kurru 2011-03-31 18:49:20

+0

@Sam Dufel - 我相信這個問題是關於集合而不是數組,它們是非常不同的。 @Kurru - 什麼?迭代器有一個'remove()'方法,用於刪除最近一次'next()'調用返回的元素。我非常懷疑迭代器會失敗,如果你使用它,看到它提供....也許你可以在正常的循環中編輯/從集合中刪除,但爲什麼你想要當你可以更安全地做到這一點? – gnomed 2011-04-01 16:33:32

0

您正在迭代的'流'可能甚至不可索引。也就是說,迭代器使得一個非常方便的「懶惰評估」模式成爲可能,即在迭代器請求數據之前,數據甚至不會被加載/構建。這對存儲庫和數據庫訪問以及網絡來說非常棒。

1

我嘗試用兩個短句子來解釋:

  • 隨着在它增強的for循環其更容易循環(更多人類可讀的..)
  • 隨着迭代這是可能在迭代期間修改列表,這是與其他方法不可能的
2

雖然我不熟悉Java Iterator,但它似乎非常相似到.NET的IEnumerable。

枚舉/迭代器的優點是:

  • 你不必知道的集合,它在某些情況下可能需要N個步驟來確定的尺寸,增加了執行時間(儘管它技術上保持線性)。相反,你只是繼續前進到下一個元素,直到沒有任何元素。

  • 由於不需要知道集合的基數,因此迭代器可以動態生成集合,或者在開始處理已有的元素時「添加元素」。例如,你可以從迭代器和/或重載迭代器獲取器中派生出來,創建「懶惰地」生成有限或無限序列的類,找出可枚舉集合中的每個元素是什麼時候請求它,而不是定義集合時。您還可以設置一個緩衝流,在其中處理您收到的記錄,數據包等,而另一個線程或進程在您之前運行,以供您排隊等待處理。

  • 任何集合,可以提供一個迭代可以以完全相同的方式被遍歷,而不必知道它是否是可轉位的,什麼方法或構件是規定大小,等等等等等等迭代器實現從而提供一種適配器允許相同的代碼在傳遞給它的任何集合上工作。

  • Java是否具有與.NET擴展方法(靜態方法不是類定義的一部分,但是可以在類型實例上工作並且可以像實例方法一樣調用)的等效方法?如果是這樣,你可以定義一些方法來獲取一個迭代器併產生一個結果,這可能是另一個迭代器。 .NET的Linq庫很大程度上依賴於這些庫,提供了一個非常強大的集合操作框架,允許將通用操作鏈接在一起,每個操作都根據前一操作的結果進行操作。