【问题标题】:Confusing point in List documentationList 文档中的混淆点
【发布时间】:2012-02-10 07:16:10
【问题描述】:

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

上面写着:

i) 请注意,这些操作的执行时间可能与 一些实现的索引值(LinkedList 类,对于 示例)。
ii) 因此,迭代列表中的元素通常是 如果调用者不知道 实施。

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

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

但我无法理解第 (ii) 点。
如果我们不知道实现,那么选择迭代器可以获得什么?
我的意思是,如果实现是 LinkedList,与通过索引访问相比,性能有什么不同吗?
我想不会,因为Iterator 无论如何都会操纵LinkedList
所以没有区别。

那么文档中(ii)的推荐是什么意思呢?

【问题讨论】:

    标签: java list collections arraylist linked-list


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      不,如果实现是LinkedList,那么迭代器的效率会更高——O(n) 迭代整个列表而不是 O(N2)。由于迭代器由 列表提供,因此它可以访问内部数据结构。它可以只保留对“当前节点”的引用,使其成为到达下一个节点的恒定时间操作:只需点击链接!

      (如果您仍然感到困惑,我建议您只看一下实现 - 这可能会更清楚。)

      【讨论】:

      • @John Skeet:所以我的想法是(例如在 for 循环中)如果我这样做 list.get(i) get 方法将必须遍历所有先前的元素才能到达节点 i使用迭代器时,get(i) 将跟随 next 指针,因为迭代器位于前一个循环的节点中?我明白了吗?
      • @user384706:是的,就是这样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多