2010-08-29 51 views
11

我瀏覽了下面的代碼示例使用迭代器的好處:什麼是Java

public class GenericTest { 

public static void main (String[] args) { 

    ArrayList<String> myList = new ArrayList<String>(); 
    String s1 = "one"; 
    String s2 = "two"; 
    String s3 = "three"; 

    myList.add(s1); myList.add(s2); myList.add(s3); 
    String st; 

    Iterator<String> itr = myList.iterator(); 

    while (itr.hasNext()) { 
    st = itr.next(); 
    System.out.println(st); 
    } 
} 
} 

我想知道什麼是使用Iterator接口的實現,而不是使用一個普通的好處 - 每個循環?

for (String str : myList) { 
    System.out.println(str); 
} 

如果這個例子是不相關的,這將是一個良好的局面時,我們應該使用迭代器?

謝謝。

+5

首先,for-each循環既不是普通的也不是老的:它在Java 5中被正式引入爲「增強for循環」。 – 2010-08-29 17:49:59

+1

可能的[在Java中Iterator接口的好處是什麼? (http://stackoverflow.com/questions/89891/what-are-the-benefits-of-the-iterator-interface-in-java) – BalusC 2010-08-29 17:58:09

回答

7

For-Each Loop是隨Java 5引入的,所以它不是那麼「古老」。

如果你只想迭代集合,你應該使用每個循環

for (String str : myList) { 
    System.out.println(str); 
} 

但有時「普通老式」 迭代器是非常有用的hasNext()方法來檢查,如果有更多的元素爲迭代器。

for (Iterator<String> it = myList.iterator(); it.hasNext();) { 
    String str = it.next(); 
    System.out.print(str); 
    if (it.hasNext()) { 
     System.out.print(";");  
    } 
} 

您也可以撥打it.remove()刪除next中返回的最新元素。

而且有ListIterator<E>它提供了雙向遍歷it.next()it.previous()

所以,它們不是等價的。兩者都需要。

+0

謝謝你,這回答我的問題。 – chronical 2010-08-30 12:52:18

0

這兩者在幾乎所有情況下在操作和性能上都是等效的。唯一的區別是舊版本的Java JVM支持迭代器,而新的「for」語法僅在JSDK 1.5(「Java 5」)中引入,並且有些人希望與1.4或更早版本保持兼容。

2
for (String str : myList) { System.out.println(str); } 

此代碼實際上會使用myList.Iterator來遍歷列表上的迭代器。由於Java 5

for環的加入使遍歷所有集合和數組容易。

通過迭代器的Java集合每個實現可以有自己的迭代的方式(列表,設置,鏈表,地圖或....)

您可以在自定義類實現這個接口也是如此。讓其他代碼迭代器遍歷對象內部的元素。

16

基本上,foreach循環是最常見的使用迭代器的快捷方式。這是遍歷所有元素。但也有一些區別:

  • 可以使用foreach循環直接
  • 您可以刪除使用迭代器對象遍歷數組,但你不能用foreach循環做
  • 有時是有用的將一個迭代器傳遞給一個函數(特別是遞歸函數)
+0

謝謝,這回答我的問題。 – chronical 2010-08-30 12:51:29

2

我不認爲在大多數情況下使用任何性能優勢,如果您只是迭代集合/數組。但根據您的使用情況,使用可能會有所不同。

  • 如果您的案件只迭代 在列表中,使用for each 循環應該從Java 1.5進行參訪。
  • 但如果你情況下被操縱 集合在迭代你需要 使用Iterator接口。
1

迭代器是對如何實現集合的抽象。它允許您一次檢查整個集合中的一個項目,並可以選擇刪除項目。

迭代器的缺點是,它可以有很多慢,如果你知道底層實現。例如,對於ArrayList使用Iterator比僅爲每個元素調用ArrayList.get(i)慢得多。這很重要取決於代碼在做什麼。