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

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

迭代器的唯一目的是通过集合进行枚举。 所有集合都包含add()方法以满足您的需要。 添加迭代器是没有意义的,因为可能会或可能不会对该集合进行排序(在HashSet的情况下)。

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

从零开始的数组索引

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

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

好的,我们走了:

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

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

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

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

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

我想不出为什么add()不能包含在Iterator的任何理论上的原因。 就像Iterator可以允许元素通过它自己从集合中删除一样,它可以被设计为处理以相同方式添加的元素。

但我会说,在我用Java编程的所有年代 – 超过15年! – 我从来没有想过一个Iterator.add()方法。 所以我怀疑它并不是那么有用。

迭代器只有一个指向下一个元素的指针。 其中ListIterator也有指向前一个元素的指针(记住,它可以向后遍历)。