任何人都可以指导为什么这样设计。
Iterator没有add()方法,但List Iterator在Java中有一个。
答案 0 :(得分:12)
我最初的想法是,像其他一些答案一样,说Iterator
可能由不可变类实现。但是,这个答案是不够的,因为Iterator确实有delete
方法(即使它不必在所有实现中都受支持)。
我认为在insert
中没有Iterator
的更好理由是它只在有序数据结构(例如列表)中有意义。例如,通过Set
的迭代器向Set
添加元素没有任何意义。
答案 1 :(得分:1)
Iterable
对象通常可能是不可变的。知道底层对象的更专业的Iterator
确实支持添加元素,可以实现该功能。与ListIterator
的情况类似。
公平地说@Eran的回答更有意义。
答案 2 :(得分:1)
列表与Iterable集合的不同之处在于,列表中所有项目的明确定义的序数位置,以及任何迭代器列表中明确定义的序数位置都是可用的/已知的。
因此,当且仅当迭代的内容是这样的列表时,才能通过迭代器进行插入操作的合理定义。
同样不适用于HashSets和TreeSets。有了这样的集合,一般都没有预测插入是否会在"之前#34;或"之后"迭代器的当前位置。因此,通常不会预测迭代器是否仍会遇到迭代期间插入的元素。因此,在某种意义上,这种特征会引起不稳定/随机/不可预测的行为。如果我不得不设计语言,我就不会包含insert()功能。
答案 3 :(得分:0)
ListIterator允许你在最近读过的元素之后添加一个元素。向List添加元素是一种较便宜的操作(因为它允许重复),允许添加。迭代器在插入列表时不需要来回遍历列表。这可能是使用ListIterator遍历允许添加元素的原因。 此逻辑的扩展也适用于删除选项,因为删除时我们需要遍历整个集合才能删除元素。
答案 4 :(得分:0)
http://www.google.com/search?q=java+iterator+insert+rationale:
Java Collections API设计常见问题 - Oracle文档
http://docs.oracle.com/javase/8/docs/technotes/guides/collections/designfaq.html:
Oracle Technology Network Software Downloads Documentation
Java Collections API Design FAQ
收藏界面
- 醇>
为什么不提供Iterator.add方法?
语义不清楚,因为迭代器的合同不能保证迭代的顺序。但请注意 ListIterator确实提供了一个添加操作,因为它确实提供了 迭代的顺序。
它们意味着不清楚无序迭代的语义应该是什么。
如果性能无关紧要,任意无序迭代表都有合理的语义选择,例如,添加的元素要么不会,要么会在进一步的迭代中出现。但是在这些选择中,能够迭代和插入通常涉及与仅迭代行为相比的性能命中。性能很重要,因此没有合理的语义选择。
答案 5 :(得分:0)
除了Oracle Java Collections API Design FAQ支持的排序参数之外,我还想到了以下参数。
Iterator
用于迭代Java中的各种集合。与其他人建议的一样,Set
集合不允许重复条目,或者某些集合(例如,BlockingQueue
)不允许null
值。
向add()
添加set()
和Iterator
操作可能会导致基础集合不支持的操作(但与remove()
不同,它将取决于值通过)。
另一方面,在ListIterator
中,这些方法旨在解决这种情况。如果元素的某些方面阻止它被添加到列表中,它们都会抛出IllegalArgumentException
。
答案 6 :(得分:0)
迭代器将用于迭代set / list / queue。所有这些 集合有自己的订购逻辑。例如,“TreeSet”是一个 排序数据结构。现在迭代通过一个letSet的树集 {2,5,7,19,22};当光标位于7时,程序员尝试添加29。 在这种情况下,树集将被排序和损坏.Hence添加 方法不应该被允许。
但是在remove()中我们只删除特定的元素 永远不会损害订购的位置。所以允许。
来到ListIterator,它允许add()。记住它仅用于
列表,根据插入维护其元素的顺序
所以,如果我们在任何给定点添加一个元素,那么排序为
算法不会受到阻碍。
答案 7 :(得分:-1)
Iterator
用于迭代,而不是添加对象。
List
是可迭代的(因此它有Iterator
)但它也能够管理实体,因此add
。
请参阅Iterable
和List
的定义,了解其目的是什么。