我试图用iterator一会儿迭代列表,由于某种原因,它会无限循环。
这是代码
{
List<Person> Person1 = new ArrayList<Person>();
Person p1 = new Person("Name1", "Virginia");
Person1.add(new Person("Nae2", "Virginia"));
printerlist(Person1);
printerlist(p1);
}
private static void printerlist(List<Person> p) {
/*
* print the list
*/
while (p.iterator().hasNext()) {
System.out.println(p.iterator().next().getCity());
}
}
Run Code Online (Sandbox Code Playgroud)
想想这行在做什么:
while (p.iterator().hasNext()) {
Run Code Online (Sandbox Code Playgroud)
每次您要评估条件时,都会得到一个从未有过的新迭代器对象。
由于您从未使用过新迭代器的任何内容,hasNext()因此永远都是正确的。
同样,在下一行:
System.out.println(p.iterator().next().getCity());
Run Code Online (Sandbox Code Playgroud)
您将获得另一个新的迭代器,因此对其进行调用next()将始终返回列表中的第一项。
为了正确循环,您需要在整个循环中重复使用相同的迭代器。您可以通过显式创建并使用单个迭代器来执行此操作,如下所示:
Iterator<Person> itr = p.iterator();
while (itr.hasNext()) {
System.out.println(itr.next().getCity());
}
Run Code Online (Sandbox Code Playgroud)
或者您可以使用诸如增强的for循环之类的方法,并让Java隐式创建和管理迭代器:
while (Person person : p) {
System.out.println(person.getCity());
}
Run Code Online (Sandbox Code Playgroud)
在功能上等同于
for (Iterator<Person> itr = p.iterator(); itr.hasNext();) {
Person person = itr.next();
System.out.println(person.getCity());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1106 次 |
| 最近记录: |