为什么Iterator没有添加方法而List Iterator在Java中有一个?

时间:2014-09-09 12:35:55

标签: java

任何人都可以指导为什么这样设计。

Iterator没有add()方法,但List Iterator在Java中有一个。

8 个答案:

答案 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

     

收藏界面

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

         

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

  2.   

它们意味着不清楚无序迭代的语义应该是什么。

如果性能无关紧要,任意无序迭代表都有合理的语义选择,例如,添加的元素要么不会,要么会在进一步的迭代中出现。但是在这些选择中,能够迭代和插入通常涉及与仅迭代行为相比的性能命中。性能很重要,因此没有合理的语义选择。

答案 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

请参阅IterableList的定义,了解其目的是什么。