簡體   English   中英

我應該為LinkedList使用什么樣的迭代?

[英]What kind of iteration should I use for LinkedList?

我知道通過索引遍歷LinkedList是不好的,因為list.get(n)是在線性時間O(n)中執行的。 因此我不應該使用索引。 我查看了iterator()調用返回的AbstactList.Itr ,它也使用了get(cursor) 我糊塗了。

正如@axtavt所指出的, LinkedList.iterator()實際上調用了AbstactList.ListItr listIterator() ,它返回AbstactList.ListItr ,它擴展了AbstactList.Itr ,它只添加了AbstactList.Itr ListIterator實現。 因此,獲取下一個元素的機制仍然與AbstactList.Itr的相同。 `AbstactList.Itrnext(); 在指定的列表上調用get(n)

對於每個循環,對任何 List (實際上甚至是任何 Iterable )的最佳迭代是:

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

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);
}

如果可以的話,你應該使用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();
...

鏈表不僅繼承自AbstractList ,但也從AbstractSequentialList這又實現了iterator()是這樣的:

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

ListIterator通過返回LinkedList是聰明使用順序訪問。

因此,無論您使用foreach, iterator()還是listIterator() ,您始終都在處理相同的智能迭代器類型。

您可以使用迭代iterator方法返回的iterator 它不需要O(n)時間去下一個項目。 它使用LinkedList ListIterator實現,因此速度很快。

您可以使用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());
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM