【问题标题】:why iterator still exists in java为什么迭代器仍然存在于java中
【发布时间】:2011-07-12 05:29:37
【问题描述】:

据我所知,Iterator 和 ListIterator 之间的主要区别是

迭代器:使您能够仅向前循环遍历集合,以获取或删除元素

ListIterator :它扩展了Iterator,允许列表的双向遍历和元素的修改

如果 ListIterator 比 Iterator 更强大,那么 sun java 开发人员应该只提供 ListIterator 的实现并弃用迭代器。为什么Iterator仍然存在于java中?使用 Iterator 比使用 ListIterator 有什么优势吗?

【问题讨论】:

  • 单链表与双链表的参数相同。
  • 单链表与双链表的答案相同。双向链表具有较高的内存和计算开销,这并不适用于所有情况。
  • 答案不太一样。迭代器可以在您自己的自定义类中使用,它通常是驱动迭代器设计的访问契约,而不是迭代器本身的开销——例如网络流的迭代器必须是只向前的。对于单点与双点列表,选择纯粹是为了开销。
  • 决不能随意弃用和删除。想想如果每次添加“更强大”的东西时删除“不太强大”的东西都会破坏的所有代码。永远不要低估保持向后兼容性的价值。
  • @aroth:好吧,考虑到 ListIterator 继承自 Iterator,我不确定你是否真的可以弃用它,即使你想这样做:)

标签: java iterator


【解决方案1】:

这是因为并非所有集合都支持向前和向后迭代。 ListIterators 专门用于具有列表语义的集合,即它们定义了元素的排序。某些集合类型(例如Sets定义其元素的顺序,因此ListIterator 对它们没有意义。

当迭代器实现需要维护足够的状态以支持前向和后向迭代以及就地修改时,还会产生额外的开销。通过同时支持IteratorListIterator,可以在需要时实现Iterator 的轻量级实现,并在需要额外功能的情况下实现更重的ListIterator

【讨论】:

  • +1 和删除 Iterator 会给遗留代码带来很多问题,即使 Set 可能是双向的
  • @Cameron,你的反应很好
【解决方案2】:

仅仅因为某些东西可以做得更多,并不能使它成为适合这项工作的工具。

IteratorListIterator 的情况下,并不是每个集合都需要支持双向迭代。此外,ListIterator 的变异能力不一定适用于一般迭代。最后,ListIterator 提供了访问元素索引的方法,但许多集合没有索引的概念。所以你可以说ListIterator 对于大多数集合来说强大了。事实上,有些人可能已经认为Iterator“太强大了”,因为它提供了一个remove 方法,这也并不总是合适的。

这里的基本指导因素是ListIterator的“列表”部分; Iterator 应该对所有集合都有用,ListIterator 专门用于像列表一样具有明确定义的元素线性排序的集合。

ListIterator 有用的一些示例:

  • 单链表和双链表
  • 数组列表
  • 具有明确定义的线性排序的其他集合

ListIterator 不适合的一些示例

  • 树木(反正很多)
  • 地图
  • 套装
  • 其他没有线性排序的集合

【讨论】:

    【解决方案3】:

    ListIterator 的强大是有代价的(实现),这对于哈希映射、集合等非列表样式的集合类型来说是非常重要的。这就是为什么它只需要在 Java 中的索引可访问集合收集框架。此外,Iterator 是 Java 的 foreach 循环中的底层设备,用一些简单的东西来支持这些语言特性是有意义的,这样它就可以更容易地适应更广泛的类型。

    【讨论】:

      【解决方案4】:

      这是因为 Java 在设计和意图上是向后二进制兼容的,所以除了 1.0->1.1 的 AWT 事件迁移之外,没有任何东西被从中删除。

      【讨论】:

        猜你喜欢
        • 2011-02-05
        • 2011-08-03
        • 1970-01-01
        • 2015-12-23
        • 2021-12-15
        • 2013-08-26
        • 2014-10-09
        • 1970-01-01
        • 2019-01-17
        相关资源
        最近更新 更多