我还是Java新手,今天我尝试了解迭代器的使用 所以我有几个问题:
为什么我需要实现Iterable,它只提供一个方法来为集合创建一个新的迭代器,但是如果我想得到的话,我也可以使用普通的或增强的for循环所有元素。 我已经阅读了这个问题:What is the Iterable interface used for?等等,但它们只是说它允许您遍历所有元素,这可以回到我的问题。
如果我实现Iterable,我是否也应该实现Iterator? 因为这个实际上提供了可以用来覆盖的方法 例如,如果我的类有一个布尔值,我是否想要我的对象在循环中,我可以写
public boolean hasNext() {
if(loop)
return true;
//other things
}
如果我喜欢在2.中说过,那么一个强大的for循环是否会使用这些覆盖的方法?
例如,上面提到的循环属性:如果for循环是真的,那么for循环会无限运行吗?
我希望有人可以帮助我更好地理解这整个概念。
答案 0 :(得分:4)
如果您要定义集合,则 实施Iterable
。例如,如果要创建自定义列表,通常会将其设为子类AbstractList
,它本身扩展AbstractCollection
,实现Collection
,实现Iterable
。因此,您的列表将“事实上”为Iterable
。
但是如果你继承AbstractList
,你就不必自己实现迭代器,因为这个方法已经在那里实现了。也就是说,您可能希望为您的需求提供专门的迭代器。
当您实施Iterable
时(如果您确实愿意),您将返回Iterator
。集合本身不应该只实现返回的迭代器Iterator
。查看AbstractList
源代码,了解其完成方式。
当您使用增强型for循环时,您正在使用Iterable
。增强的for循环只是iterator()
返回的迭代器上的循环的语法糖。这意味着编译器会将代码转换为使用迭代器。这就是为什么必须为要在增强的for循环中使用的集合实现Iterable
的原因。