为什么Iterator接口中没有add方法

dro*_*tes 15 java collections iterator

IteratorSun中添加了remove方法来删除集合中最后访问的元素.为什么没有添加方法来向集合中添加新元素?它可能对集合或迭代器有什么样的副作用?

jon*_*tro 12

好的,我们走了:

设计常见问题清楚地说明了答案:

为什么不提供Iterator.add方法?

鉴于迭代器的合同不能保证迭代的顺序,语义也不清楚.但请注意,ListIterator确实提供了添加操作,因为它确实保证了迭代的顺序.

http://docs.oracle.com/javase/1.4.2/docs/guide/collections/designfaq.html#10


gob*_*dor 9

迭代器的唯一目的是通过集合进行枚举.所有集合都包含add()满足您目的的方法.添加迭代器是没有意义的,因为集合可能会或可能不会被订购(在a的情况下HashSet).

编辑:在处理另一个问题时,我想出了另一个Iterator缺乏add()方法的原因.在ArrayList(第111行)和HashMap(第149 行)的引擎下看,我们看到实现只是一些围绕对象数组的方法.现在我们考虑如何在内存中处理数组.

从零开始的数组索引

这是一个包含5个元素的数组.但是,有六个指数.这个数组中的字母"a"被列为元素0,因为为了读取它,就像计算机那样从左到右读取,你必须从索引0开始.现在,如果我们遍历这个数组(是的,集合,但它归结为一个数组),我们将从索引0开始并继续索引1.在Iterator中的这一点,我们想要调用add("f");.在这一点上,让我们比较的意义add()remove().remove()会在数组中留下一个容易跳过的空间,因为我们可以立即意识到它不是成员.另一方面,add()会放一个之前不存在的新元素.这将影响我们迭代的数组的长度.当我们到达最后一个元素时会发生什么?我们甚至可以保证它在那里(也就是说,阵列没有超过最大尺寸)?

总而言之,这两种论点都有有效点,但最重要的是add()方法的行为在所有情况下都没有很好地定义.Sun必须选择限制功能的地方,并且他们选择不包含此方法.

  • 但是,从"迭代器"中移除也没有意义.然而`remove()`的存在使得(可选)可以删除元素而不会使`Iterator`无效.不应该'添加(E)`以便可以添加元素而不会使`Iterator`无效?当然,您可以在迭代后向`Iterable`添加元素.但删除元素也是如此.我认为`Iterator`有一个`remove()`方法,因为与`add(T)`相反,它通常很有效,易于实现和定义. (2认同)

jon*_*tro 5

如果您正在处理列表,则可以使用ListIterator,它提供添加和删除操作.

  • 实际上没有回答这个问题.但是,是的,`Iterator`没有实现`add`,因为它不是`ListIterator`. (3认同)