2010-08-29 63 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)慢得多。这很重要取决于代码在做什么。