在Java中使用迭代器有什么好处

时间:2010-08-29 17:22:24

标签: 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-each循环有什么好处?

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

如果这个例子不相关,那么当我们应该使用Iterator时会有什么好处?

谢谢。

7 个答案:

答案 0 :(得分:22)

基本上,foreach循环是迭代器最常用的快捷方式。这是迭代所有元素。但是存在一些差异:

  • 您可以直接使用foreach循环遍历数组
  • 您可以使用迭代器删除对象,但不能使用foreach循环
  • 有时将迭代器传递给函数(特别是递归的)

答案 1 :(得分:11)

For-Each循环是在Java 5中引入的,所以它不是那么“旧”。

如果你只想迭代一个集合,你应该使用for each循环

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()来删除下一个返回的最新元素。

还有ListIterator<E>提供双向遍历it.next()it.previous()

所以,它们并不等同。两者都是必需的。

答案 2 :(得分:2)

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

此代码实际上将使用myList.Iterator对列表进行迭代。

从java 5开始添加新的for循环,以便更轻松地对集合和数组进行迭代。

通过Iterator Java Collection中的每个实现都可以有自己的迭代方式(List,Set,LinkedList,Map或....)

您也可以在自定义类中实现此接口。让其他代码迭代你对象中的元素。

答案 3 :(得分:2)

我不认为在大多数情况下使用任何一个性能优势,如果你只是迭代集合/数组。但根据您的使用情况,使用情况可能会有所不同。

  • 如果您的案例仅迭代 超过列表,使用for each 自Java以来​​,循环应该是优先的 1.5。
  • 但如果您的案例正在操纵 迭代时的集合你需要 使用 Iterator界面。

答案 4 :(得分:1)

迭代器是对集合实现方式的抽象。它允许您一次遍历整个集合一个项目,可选择删除项目。

Iterator的缺点是,如果您知道底层实现,它可能会很慢。例如,对于ArrayList使用Iterator比为每个元素调用ArrayList.get(i)要慢得多。这是否重要取决于代码的作用。

答案 5 :(得分:0)

这两者在操作和性能方面几乎在所有情况下均相同。唯一的区别是旧版本的Java JVM支持迭代器,而新的“for”语法仅在JSDK 1.5(“Java 5”)中引入,有些人希望保持与1.4或更早版本兼容。

答案 6 :(得分:0)

为了能够在迭代时安全地从集合中移除元素并避免 DO $do$ BEGIN IF EXISTS (SELECT FROM pg_catalog.pg_tables WHERE schemaname = 'myschema' AND tablename = 'mytable') THEN RAISE NOTICE 'Table myschema.mytable already created.'; ELSE CREATE TABLE myschema.mytable (i integer); -- your table definition here END IF; END $do$; 以防您在迭代时需要从循环中移除元素

请参考this question