在Java的列表接口中需要listIterator()和iterator()是什么?

在Java的列表接口中需要listIterator()和iterator()是什么?,java,list,iterator,Java,List,Iterator,List接口有两种方法listIterator()和iterator()。为什么这两个都需要 从 Iterator迭代器() 按正确的顺序返回此列表中元素的迭代器。 ListIterator ListIterator() 返回此列表中元素的列表迭代器(按正确顺序)。 ListIterator ListIterator(int索引) 返回此列表中元素的列表迭代器(按正确顺序),从 列表中的指定位置。指定的索引指示将被删除的第一个元素 通过对next的初始调用返回。对previous的初始调用将返回

List
接口有两种方法
listIterator()
iterator()
。为什么这两个都需要

Iterator迭代器()
按正确的顺序返回此列表中元素的迭代器。
ListIterator ListIterator()
返回此列表中元素的列表迭代器(按正确顺序)。
ListIterator ListIterator(int索引)
返回此列表中元素的列表迭代器(按正确顺序),从
列表中的指定位置。指定的索引指示将被删除的第一个元素
通过对next的初始调用返回。对previous的初始调用将返回带有
指定的索引减1。

因此,基本上,
ListIterator()
有这个额外的方法来获取
previous和next
元素,而
Iterator()
只有
next
元素。这仅仅是为了这个目的,在List interface中还有另一个
ListIterator()接口
ListIterator()方法

Iterator似乎适用于单链接列表,双链接列表的ListIterator。

具体来说,它们都是必需的,因为
list
是一种
Iterable
类型,它指定了
迭代器迭代器()
方法

现在
List
可以简单地覆盖
Iterable
中的
iterator()
方法,以声明
ListIterator
的返回类型,即
iterator
类型(从而满足契约)。为什么不这样做可能是一个设计决策

编辑:
@ajb在一篇评论中指出,在创建
List
接口之后,JavaSE5中添加了协变返回类型。这就解释了为什么
List
有这两种方法,因为在Java 1.2中
iterator()
返回类型不能缩小到
ListIterator

Java设计得非常坚固,尽管有很多语言实现更改,但不会影响Java上运行的代码

例如,您通常可以将“Java JRE 6”替换为“Java JRE 7”,并且大多数代码都没有问题——这是一个使用新语法的完整语言升级。您还可以用开源实现替换Java JRE,您将得到相同的结果——这些东西几乎可以正常工作

因此,当他们设计一个类时,他们必须为实现者和编码者设计它

如果他们只是让ArrayList为“Iterable”,那么对于ArrayList,返回类型为ListIterator的迭代器,那么接口不需要另一个实现器(OpenJDK)来返回正确的类型——不仅如此,用户在不查看文档的情况下也不知道返回的是什么类型(如果每个人都以这种方式编程,Eclipse-ctrl-space就没有那么有用了)

Java通常会尽可能地显式…这是一件非常好的事情,因为它停止了猜测和相关错误


当无法使接口和类型足够明确时,他们会非常仔细地编写文档,但如果可能的话,他们会避免这种情况。

由于Java 5,因此可以使用更具体的返回类型(称为协变返回类型)覆盖方法但是Java 1.2引入了
ListIterator
。为了避免使用
iterator()
必须有一个新方法

API不可能从Java 5开始更改,因为这会破坏
List
的所有实现,这些实现没有声明
iterator()
返回
ListIterator
,如果大多数实现实际返回
ListIterator
实例


类似的困境是
枚举
迭代器
。现在
迭代器
将扩展
枚举
,只需添加
remove()
方法。或者更好的是
迭代器
枚举
可修改迭代器
替换为附加的
remove()
会被添加。

如果是这样的话,它应该只是linkedlist类中的一个方法,而不是在这个类上有一个接口。我的意思是它应该同时作用于arraylist和linkedlist,因为如果我的方法需要一个列表,我可以传递arraylist或linkedlist,因为这样客户端可能不得不将结果向下转换到
(列表迭代器)
使用附加的
列表迭代器
功能。@ajb您可以在子类型中编写重写方法,使返回类型比在超类/接口中声明的类型返回更具体,编译器将接受它。这意味着如果您将
列表
用作子类型中的
列表
cal case上面的
iterator()
被声明为返回
ListIterator
,您不必向下转换。我认为协变返回类型是在1.5中添加的。
ListIterator
从1.2开始就存在了。它看起来像
iterator()
AbstractSequentialList的方法就是
返回listIterator()
。为什么
AbstractList
ArrayList
不一样,我不知道。看起来他们本可以这么做。@ajb我不知道协变返回是一个附加功能。谢谢你指出这一点,因为现在它非常有意义。因为这是他们设计的方式。在t他看到了JDK文档。你不会得到比这更好的信息了。@ajb看到你对答案的评论太晚了
Iterator<E> iterator()

Returns an iterator over the elements in this list in proper sequence.

ListIterator<E> listIterator()

Returns a list iterator over the elements in this list (in proper sequence).

    ListIterator<E> listIterator(int index)

    Returns a list iterator over the elements in this list (in proper sequence), starting at the 
specified position in the list. The specified index indicates the first element that would be 
returned by an initial call to next. An initial call to previous would return the element with the 
specified index minus one.