【发布时间】:2016-04-18 23:17:17
【问题描述】:
如果我运行以下代码,它将打印出 3 次重复,但是当我删除 while 循环内的 if 语句(只是为了查看它会迭代多少次)时,它会启动一个无限循环。
这个hasNext() 方法实际上是如何工作的?我认为这只会迭代 5 次,因为列表中有 5 个项目。
public class ExerciseOne {
public static void main(String []args){
String []colors = {"MAGENTA","RED","WHITE","BLUE","CYAN"};
List<String> list = new ArrayList<String>();
for(String color : colors)
list.add(color);
String[] removeColors = {"RED","WHITE","BLUE"};
List<String> removeList = new ArrayList<String>();
for(String color : removeColors)
removeList.add(color);
removeColors(list,removeList);
System.out.printf("%n%nArrayList after calling removeColors:%n");
for(String color : list)
{
System.out.printf("%s ",color);
}
}
private static void removeColors(Collection<String> collection1, Collection<String> collection2)
{
Iterator<String> iterator = collection1.iterator();
while(iterator.hasNext()){
if(collection2.contains(iterator.next()))
System.out.println("duplicate");
}
}
}
【问题讨论】:
-
您阅读文档了吗?
-
hasNext不会移动迭代器光标,iterator.next()会移动它,所以当您删除条件时,您实际上也删除了光标更改 -
是的当然,“如果迭代有更多元素,则返回true”,但我无法理解它何时到达列表末尾为什么它会继续循环,我会尝试找到其他一些教程或文档,因为来自 oracles 的那个对我来说不是那么清楚
-
检查@leo的答案是否正确
-
@imoteb,它没有到达列表的末尾。如果您删除
if条件,您将永远不会向前移动迭代器,它只会永远停留在列表的开头。