dro*_*tes 15 java collections iterator
在Iterator
Sun中添加了remove方法来删除集合中最后访问的元素.为什么没有添加方法来向集合中添加新元素?它可能对集合或迭代器有什么样的副作用?
jon*_*tro 12
好的,我们走了:
设计常见问题清楚地说明了答案:
为什么不提供Iterator.add方法?
鉴于迭代器的合同不能保证迭代的顺序,语义也不清楚.但请注意,ListIterator确实提供了添加操作,因为它确实保证了迭代的顺序.
http://docs.oracle.com/javase/1.4.2/docs/guide/collections/designfaq.html#10
迭代器的唯一目的是通过集合进行枚举.所有集合都包含add()
满足您目的的方法.添加迭代器是没有意义的,因为集合可能会或可能不会被订购(在a的情况下HashSet
).
编辑:在处理另一个问题时,我想出了另一个Iterator
缺乏add()
方法的原因.在ArrayList
(第111行)和HashMap
(第149 行)的引擎下看,我们看到实现只是一些围绕对象数组的方法.现在我们考虑如何在内存中处理数组.
这是一个包含5个元素的数组.但是,有六个指数.这个数组中的字母"a"被列为元素0,因为为了读取它,就像计算机那样从左到右读取,你必须从索引0开始.现在,如果我们遍历这个数组(是的,集合,但它归结为一个数组),我们将从索引0开始并继续索引1.在Iterator中的这一点,我们想要调用add("f");
.在这一点上,让我们比较的意义add()
和remove()
.remove()
会在数组中留下一个容易跳过的空间,因为我们可以立即意识到它不是成员.另一方面,add()
会放一个之前不存在的新元素.这将影响我们迭代的数组的长度.当我们到达最后一个元素时会发生什么?我们甚至可以保证它在那里(也就是说,阵列没有超过最大尺寸)?
总而言之,这两种论点都有有效点,但最重要的是add()
方法的行为在所有情况下都没有很好地定义.Sun必须选择限制功能的地方,并且他们选择不包含此方法.
如果您正在处理列表,则可以使用ListIterator,它提供添加和删除操作.
归档时间: |
|
查看次数: |
8004 次 |
最近记录: |