在使用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
答案 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循环中,您将在不同位置更改值。