我不清楚List文档中的一点。
它说:
i)注意,这些操作可以按时间比例执行 某些实现的索引值(LinkedList类,for 例子)。
ii)因此,通常迭代列表中的元素 如果调用者不知道,则最好通过它进行索引 实施
请注意,我将(i)和(ii)放在引号中。
由于我们访问链表与数组随机访问的方式,点(i)非常明显。
虽然我无法理解第(ii)点
如果我们不了解实现,我们会通过优选迭代器获得什么?
我的意思是如果实现是LinkedList
,那么性能是否与通过索引访问有任何不同?
我想不到,因为Iterator
无论如何都会操纵LinkedList
所以没有区别。
那么(ii)的建议在文件中的含义是什么?
答案 0 :(得分:6)
链表的迭代器只能有一个指向列表中下一个节点的指针,并且每次调用next()
时都转到下一个节点。它不是每次都从头开始。然而,如果您使用索引并调用get(i)
,则链接列表必须从头开始迭代,直到每次迭代时的第i个元素。
您错过的是ArrayList的迭代器实现和LinkedList的迭代器实现完全不同。
答案 1 :(得分:4)
不,如果实现是LinkedList
,则迭代器将更有效 - O(n)用于迭代整个列表而不是O(N 2 )。由于迭代器由提供列表,因此它可以访问内部数据结构。它可以只保留对“当前节点”的引用,使其成为进入下一个节点的恒定时间操作:只需按照链接进行操作即可!
(如果你仍然感到困惑,我建议你只看一下实施 - 这可能会让它变得更加清晰。)