【发布时间】:2015-12-09 06:07:46
【问题描述】:
我已经看到很多关于如何实现 Iterable 接口的示例,其中 iterator() 方法仅返回要迭代的原始集合。但这似乎违背了迭代器的部分目的,因为它应该能够迭代所述集合而不用担心集合在你下面的变化。 Iterable 的 iterator() 方法不应该总是返回集合的克隆吗?而且,最好是深度克隆?
我知道,这个问题的答案可能部分基于意见,这是禁止的。但是,我想要了解的是 Iterable 接口的初衷,而不是人们可能决定或未决定使用它的目的。
【问题讨论】:
-
我认为这取决于集合的实现。
-
这取决于,一般来说,大多数
Collection(s) AFAIK 出于这个原因使用快速失败Iterator。 -
这绝对不是
Iterable接口的原始实现。这将使您在迭代时绝对不可能更改集合元素,这完全是一件有用的事情。 -
有些集合可以(在某种程度上)按照您的建议进行。用于
CopyOnWriteArrayList的Iterator在构造Iterator时包含对支持Object[]的引用。在迭代过程中对List的任何写入都会创建一个全新的数组。