我知道通过索引遍历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)
。
答案 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());
}