我正在查看Java中的链表,用C学习它们,我注意到我可以使用迭代器类来浏览链表。但我发现奇怪的是,他们使用ListIterator在列表上向前迭代(它也可以用于根据指针的位置向后迭代),迭代器在列表上向后迭代。我的问题是,为什么我们只能使用Iterator迭代向前和向后迭代?这两者有什么区别?
答案 0 :(得分:1)
列表的迭代器,允许程序员在任一方向遍历列表,在迭代期间修改列表,并获取迭代器在列表中的当前位置。
相反,Iterator
can only iterate forwards.
答案 1 :(得分:1)
Iterator
是非常通用的解决方案,它应该适合所有数据结构,实际上您可以迭代每个类Collection
(documentation)。但是,并非每个类都可以确保仅仅由于其内部数据结构而向后迭代。例如TreeSet
只知道 root 元素:
所以Iterator
尝试使所有数据结构的共同能力至少在一个方向上可迭代(documentation)
ListIterator
是特殊,而非一般,解决方案仅适用于特殊List
,因为它们的内部结构可能是在两个方向上迭代(并且还允许在其间添加和删除元素)。对于TreeSet
等其他结构,这是不可能的,因此Collection
不会为所有ListIterator
提供Collection
,只有List
拥有它。来自documentation:
列表的迭代器,允许程序员在任一方向遍历列表,在迭代期间修改列表,并获取迭代器在列表中的当前位置。
要进行整理,如果Collection
提供一个特殊的Iterator
,例如ListIterator
,那么所有实施类,TreeSet
和co。需要实现这个方法。但是,这些类可能无法满足该要求(无需额外的额外开销)。