迭代器和每个循环的差异

时间:2013-12-11 07:33:32

标签: java collections

在使用Iterator和For Each循环时,我发现输出之间存在重大差异。我希望它是一样的,但我不知道为什么会这样。即使我搜索它,但也没有任何有用的原因。

public class EnhancedForLoopVsIterator {
      public static void main(String...args){

        Set s = new HashSet();
        s.add("abc");
        s.add(new String("abc"));
        s.add(null);

        Set s1 = new HashSet();
        s1.add("abc");
        s1.add(new String("abc"));
        s1.add(null);


        for(Iterator it = s.iterator();it.hasNext();){
              for(Iterator it1 = s1.iterator();it1.hasNext();){
                    System.out.println(it.next() + " & " + it1.next() );
              }
        }

        System.out.println("------------");

        for(Object obj: s){
              for(Object obj1: s1){
                    System.out.println(obj + " & " + obj1 );
              }
        }

      }
}

输出如下:

null & null
abc & abc
------------
null & null
null & abc
abc & null
abc & abc

3 个答案:

答案 0 :(得分:2)

将为每个it.next()调用

it1.hasNext(),这将继续执行外部迭代器,导致it.hasNext()比最初预期更早返回false

要使用迭代器实现相同的输出,您需要执行以下操作:

for(Iterator it = s.iterator();it.hasNext();){
    Object n = it.next();
    for(Iterator it1 = s1.iterator();it1.hasNext();){
        System.out.println(n + " & " + it1.next() );
    }
}

while-loop,我觉得更常用:

Iterator it = s.iterator();
while(it.hasNext()){
    Object n = it.next();
    Iterator it1 = s1.iterator()
    while(it1.hasNext()){
        Object n2 = it1.next();
        System.out.println(n + " & " + n2);
    }
}

您可以内联其中一些参数以使其看起来更干净,我为了清楚起见将其写出来。

答案 1 :(得分:0)

Iterator是基于索引的对象检索。在第一个循环指针指向索引0处的对象时,它执行it.next(),在内部循环中它再次调用it.next()并将指针移动到下一个索引即1,y0u将获取索引1处的对象

答案 2 :(得分:0)

您正在使用

 for(Iterator it = s.iterator();it.hasNext();){
          for(Iterator it1 = s1.iterator();it1.hasNext();){
                System.out.println(it.next() + " & " + it1.next() );
          }
    }

您需要注意的一点是,无论何时使用 it.next(),它都会采用下一个值来表示我们可以将其称为for循环的第3部分。

因此,当它出现在it1迭代(第二个for循环)时,它也将出现在第一个for循环中。

BUt here

    for(Object obj: s){
          for(Object obj1: s1){
                System.out.println(obj + " & " + obj1 );
          }
    }

你没有用obj1改变obj的值。

换句话说,您可以理解,使用迭代器,您在同一行更改迭代器值,但在foreach循环中,您将在不同位置更改值。