2

我有以下代码:

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class IteratorExample {

    public static void main(String[] args) {

        List<String> listnames = new ArrayList<String>();
        listnames.add("Tom");
        listnames.add("Finn");
        listnames.add("Harry");

        ListIterator<String> iteratorNames = listnames.listIterator();
        while (iteratorNames.hasNext()) {
            System.out.println(iteratorNames);
        }

    }

}

当我执行时,我得到如下奇怪的输出(每次运行程序时都会有所不同):

java.util.ArrayList$ListItr@a200d0c
java.util.ArrayList$ListItr@a200d0c
java.util.ArrayList$ListItr@a200d0c
java.util.ArrayList$ListItr@a200d0c
java.util.ArrayList$ListItr@a200d0c

程序也无限运行。

为什么它不打印列表值?

4

6 回答 6

4

您正在查看迭代器本身。

采用

iteratorNames.next()

获得下一个项目。

于 2013-10-26T14:59:19.827 回答
3

更改以下行:

System.out.println(iteratorNames);

到:

System.out.println(iteratorNames.next());
于 2013-10-26T14:58:39.873 回答
2

我得到如下奇怪的输出

它只是使用toString()对象类的默认实现打印对象的内存地址。

public String toString() {
   return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

程序也无限运行。

正如其他答案所述,您必须使用next()(ie System.out.println(iteratorNames.next());) 有两个原因:

  1. 它允许您在迭代时获取列表中的元素
  2. 它推进迭代器的光标位置

这就是您的程序无限期运行的原因,因为光标仍位于列表的第一个位置,因此hasNext()将始终返回 true。

使用next()该程序如下所示:

while (iteratorNames.hasNext()) {
        String element = iteratorNames.next(); //now you can do what you want with this element
        System.out.println(element);
}
于 2013-10-26T15:03:24.283 回答
2

其他人已经提到了您如何使用Iterator--by 查询它以查看它是否具有下一个值,然后通过next()如果有则获取它。

但是,您可以选择通过一个很好的句法抽象来完全避免这些低级细节:

for (String name : listnames) {
  System.out.println(name);
}

试一试。在我看来,它是 Java 5 最有用的特性之一。这里有更多关于它的信息。

于 2013-10-26T15:08:46.410 回答
1

在您的程序System.out.println(iteratorNames); 中,它将调用 Object 类的 toString(),该类将返回对象的字符串表示形式(参见 toString() 上的实现)

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

这就是为什么你得到像java.util.ArrayList$ListItr@a200d0c.

调用next()它将返回列表中的下一个元素。如下:

System.out.println(iteratorNames.next());
于 2013-10-26T15:11:11.797 回答
0

采用,

System.out.println((String)iteratorNames.next());
于 2013-10-26T15:08:07.877 回答