[英]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.Itr
的next();
在指定的列表上調用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.