我应该为LinkedList使用什么样的迭代?

时间:2011-09-23 09:57:15

标签: java iterator linked-list

我知道通过索引遍历LinkedList是不好的,因为list.get(n)是在线性时间O(n)中执行的。因此我不应该使用索引。我查看了AbstactList.Itr调用返回的iterator(),它也使用了get(cursor)。我很困惑。

正如@axtavt所指出的那样,LinkedList.iterator()实际上调用listIterator(),返回AbstactList.ListItr,扩展AbstactList.Itr并且只添加ListIterator接口的实现。因此,获得下一个元素的机制仍然与AbstactList.Itr中的相同。 `AbstactList.Itr next();在指定列表中调用get(n)

6 个答案:

答案 0 :(得分:3)

任何 List(实际上甚至任何 Iterable)的最佳迭代是for each循环:

for(Element e : myList){
    // do something
}

答案 1 :(得分:3)

foreach循环非常有效且简单:

List<String> list = new LinkedList<String>();
list.add("First");
list.add("Second");
list.add("Third");
list.add("Fourth");

for(String s : list) {
    System.out.println(s);
}

答案 2 :(得分:2)

如果可以的话,你应该使用foreach循环 - 这是最有效的:

List<Item> myList = ...;

for (Item item : myList) {
  ...
}

如果需要修改循环内的列表,或者在一个循环中遍历多个集合,请使用迭代器:

List<Item> myList = ...;
Iterator<Item> it = myList.iterator();

while (it.hasNext()) {
  Item item = it.next();
  ...
}

如果您需要向后移动或其他特定于链接列表的内容,请使用listIterator

ListIterator<Item> it = myList.listIterator();
...

答案 3 :(得分:2)

LinkedList不仅继承自AbstractList,还继承自AbstractSequentialList,后者又实现iterator(),如下所示:

public Iterator<E> iterator() {
    return listIterator();
}

ListIterator返回的LinkedList对于使用顺序访问非常聪明。

因此,无论您使用foreach,iterator()还是listIterator(),您始终都在使用相同的智能迭代器类型。

答案 4 :(得分:0)

您可以使用由iterator方法返回的迭代器。它不需要O(n)时间去下一个项目。它使用来自ListIterator的{​​{1}}实施,因此速度很快。

答案 5 :(得分:0)

您可以使用Iterator,它可以让您更快地访问。列表的示例代码:

 List<String> list = new LinkedList<String>();
    list.add("First");
    list.add("Second");
    list.add("Third");
    list.add("Fourth");

    Iterator it = list.iterator();

    while(it.hasNext())
    {
        System.out.println(it.next());
    }