Java Iterator进入无限while循环

Yuv*_*Raj -1 java arraylist

我试图用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)

azu*_*rog 5

想想这行在做什么:

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)