为什么迭代器仍然存在于java中

时间:2011-07-12 05:29:38

标签: java iterator

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

迭代器:只允许您向前循环收集,以获取或删除元素

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

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

4 个答案:

答案 0 :(得分:12)

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

当迭代器实现需要维持足够的状态以支持前向和后向迭代以及就地修改时,还会产生额外的开销。通过同时支持IteratorListIterator,可以在需要时轻量级地执行Iterator,对于那些具有额外功能的情况,可以使用较重的ListIterator是必需的。

答案 1 :(得分:6)

仅仅因为某些事情可以做得更多,并不能使它成为工作的正确工具。

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

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

ListIterator有用的一些示例:

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

ListIterator 适合的地方的一些例子:

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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