List文档中的混淆点

时间:2012-01-14 10:08:07

标签: java list collections arraylist linked-list

我不清楚List文档中的一点。

它说:

  

i)注意,这些操作可以按时间比例执行   某些实现的索引值(LinkedList类,for   例子)。
  ii)因此,通常迭代列表中的元素   如果调用者不知道,则最好通过它进行索引   实施

请注意,我将(i)和(ii)放在引号中。

由于我们访问链表与数组随机访问的方式,点(i)非常明显。

虽然我无法理解第(ii)点 如果我们不了解实现,我们会通过优选迭代器获得什么? 我的意思是如果实现是LinkedList,那么性能是否与通过索引访问有任何不同? 我想不到,因为Iterator无论如何都会操纵LinkedList 所以没有区别。

那么(ii)的建议在文件中的含义是什么?

2 个答案:

答案 0 :(得分:6)

链表的迭代器只能有一个指向列表中下一个节点的指针,并且每次调用next()时都转到下一个节点。它不是每次都从头开始。然而,如果您使用索引并调用get(i),则链接列表必须从头开始迭代,直到每次迭代时的第i个元素。

您错过的是ArrayList的迭代器实现和LinkedList的迭代器实现完全不同。

答案 1 :(得分:4)

不,如果实现是LinkedList,则迭代器将更有效 - O(n)用于迭代整个列表而不是O(N 2 )。由于迭代器由提供列表,因此它可以访问内部数据结构。它可以只保留对“当前节点”的引用,使其成为进入下一个节点的恒定时间操作:只需按照链接进行操作即可!

(如果你仍然感到困惑,我建议你只看一下实施 - 这可能会让它变得更加清晰。)