为什么迭代器接口中没有 add 方法

2022-09-01 23:11:56

在 Sun 中添加了 remove 方法以删除集合中最后一个访问的元素。为什么没有 add 方法可以将新元素添加到集合中?它可能对集合或迭代器产生什么样的副作用?Iterator


答案 1

好了,我们开始吧:

答案在设计常见问题解答中明确说明:

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

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

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


答案 2

迭代器的唯一用途是通过集合进行枚举。所有集合都包含满足您目的的方法。添加到迭代器是没有意义的,因为集合可能是有序的,也可能不是有序的(在 a 的情况下)。add()HashSet

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

zero-based array indexes

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

总而言之,以某种方式参数都具有有效点,但底线是方法的行为并非在所有情况下都得到了很好的定义。Sun 必须选择在何处限制功能,他们选择不包括此方法。add()