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

Java 迭代器接口中为什么没有add方法,java,collections,iterator,Java,Collections,Iterator,在迭代器中,Sun添加了remove方法来删除集合中最后访问的元素。为什么没有add方法向集合中添加新元素?迭代器对集合或迭代器可能有什么样的副作用?迭代器的唯一目的是通过集合进行枚举。所有集合都包含满足您需要的add()方法。添加到迭代器没有任何意义,因为集合可能是有序的,也可能不是有序的(对于HashSet) EDIT:在处理另一个问题时,我提出了另一个原因,即Iterator缺少add()方法。在(第111行)和(第149行)的框架下,我们看到实现只是围绕对象数组的几个方法。现在我们考虑数

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

迭代器的唯一目的是通过集合进行枚举。所有集合都包含满足您需要的
add()
方法。添加到迭代器没有任何意义,因为集合可能是有序的,也可能不是有序的(对于
HashSet

EDIT:在处理另一个问题时,我提出了另一个原因,即
Iterator
缺少
add()
方法。在(第111行)和(第149行)的框架下,我们看到实现只是围绕对象数组的几个方法。现在我们考虑数组如何在内存中处理。< /P>

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


总而言之,这些参数在某种程度上都是有效的,但归根结底,
add()
方法的行为并不是在所有情况下都定义得很好。Sun不得不选择在何处限制功能,他们选择不包括此方法。

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


但我要说的是,在我用Java编程的所有岁月里——超过15年我从未想要一个
迭代器.add()
方法。所以我怀疑它并没有那么有用

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

好的,我们开始:

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

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

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


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

因为ListIterator保持插入顺序,所以您可以到达要添加的点。迭代器不关心顺序,所以如果它在迭代时以过去的值添加对象,那将是一场灾难。这就是迭代器只被赋予remove()方法的原因,因为您有一个特定的对象和从何处移除的位置。

我认为您有一个重复:@mihaisimi--不,这是一个真正不同的问题。是的,您是对的。库伯德在那篇文章中提供了一个很好的答案,实际上并没有回答这个问题。但是,是的,
Iterator
没有实现
add
,因为它不是
ListIterator
“因为集合可能是有序的,也可能不是有序的”——请您详细说明一下。谢谢你的陈述:-)。ThanksA HashSet不保证其成员的顺序。如果你通过迭代来找到一个插入值的点,那么你已经击败了迭代器的点。但是从
迭代器中删除也没有意义。然而
remove()
的存在使得(可选)可以在不使
迭代器无效的情况下删除元素。是否应该存在
add(E)
,以便在不使
迭代器无效的情况下添加元素?当然,您可以在迭代后将元素添加到
Iterable
。但去除元素也是如此。我认为,
Iterator
有一个
remove()
方法,因为与
add(T)
@Robert相比,它通常效率高,易于实现,定义清晰。我承认这是一个不可靠的论点,但我同意你的最后一句话。正如jontro在他的(第二个)答案中所链接的那样,设计常见问题甚至没有给出很好的解释。我相信
remove()
方法比
add(T)
方法在
迭代器中占有更大的位置。最重要的是,出于某种原因,Sun选择在该特定点限制
迭代器的功能。很抱歉回答得太晚。但例如LinkedHashSet确实保持了插入顺序。那他们为什么不做迭代器呢
Add()
方法在这种情况下可以正常工作,对吗?@Stefan阅读了这个问题:哪一个涵盖了这种情况