为什么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也有指向前一个元素的指针(记住,它可以向后遍历)。