【问题标题】:Array List retrieval order数组列表检索顺序
【发布时间】:2012-02-27 22:43:29
【问题描述】:

我有一个 java ArrayList 向其中添加 5 个对象。

如果我遍历列表并打印出来,然后遍历列表并再次打印出来。

这两种情况下的检索顺序会一样吗? (我知道它可能与插入顺序不同)

【问题讨论】:

    标签: java arraylist


    【解决方案1】:

    是的,假设您没有修改中间的列表。来自http://docs.oracle.com/javase/6/docs/api/java/util/List.html

    迭代器

    Iterator<E> iterator()

    以正确的顺序返回此列表中元素的迭代器。

    可能有点模糊,但在该页面的其他部分,该术语已定义:

    正确的顺序(从第一个元素到最后一个元素)

    【讨论】:

    • 他们本可以做得比说明“正确的顺序”更好:-)
    • @TheNail - 好吧,List 的文档一开始就说List 是“有序集合(也称为序列)。 "
    【解决方案2】:

    (我知道它可能与插入顺序不同)

    不,不会。 List 的合约要求 add 的顺序与迭代顺序相同,因为 add 在末尾插入,iterator 生成一个迭代器,按顺序从头到尾迭代。

    Set 不需要这个,所以你可能会混淆SetList 关于迭代顺序的合同。

    来自Javadoc

    Iterator<E> iterator()

    以正确的顺序返回此列表中元素的迭代器。

    【讨论】:

      【解决方案3】:

      List接口的规范中保留了顺序。

      Set 类不保持顺序。

      【讨论】:

        【解决方案4】:

        如果您不更改列表,则迭代顺序将保持不变。列表具有合同规定的顺序,iterator 规范保证它按该顺序迭代元素。

        【讨论】:

          【解决方案5】:

          是的,ArrayList 保证其元素的迭代顺序 - 也就是说,它们将以您插入它们的相同顺序出现,前提是您在迭代 ArrayList 时不进行任何插入。

          【讨论】:

            【解决方案6】:

            除非您更改正在使用的迭代器,否则检索不会改变。只要您使用相同的方法进行检索并且没有更改列表本身,那么项目将以相同的顺序返回。

            【讨论】:

              【解决方案7】:

              当您使用 add(E e) 将元素添加到 ArrayList 时,该元素将附加到列表的末尾。因此,如果您所做的只是多次调用单参数add 方法然后进行迭代,那么迭代的顺序将与调用add 的顺序完全相同。

              【讨论】:

                【解决方案8】:

                每次迭代相同的未修改列表时,迭代顺序都是相同的。

                另外,假设您使用add() 方法添加元素,迭代顺序与插入顺序相同,因为此方法将元素附加到列表的末尾。

                【讨论】:

                  【解决方案9】:

                  是的,只要列表没有发生突变并且您使用相同的迭代器,就可以保证检索顺序相同,但是必须依赖检索顺序表明设计存在问题。将业务逻辑建立在特定的检索顺序上通常不是一个好主意。

                  【讨论】:

                  • 这个答案几乎是现有答案的重复。
                  【解决方案10】:

                  如果您不修改它们(向其中添加或删除项目),即使 Set 也将返回相同的结果。

                  【讨论】:

                  • 在实践中这通常是正确的,但不能保证(SortedSet 除外!)。从理论上讲,您可能会遇到一个在幕后重组其内部结构的 Set...
                  • 无法保证 Set 不会在任何时候在内部重新组织自身。无法保证集合迭代将按任何特定顺序进行,或者顺序不会从一个迭代器更改为下一个迭代器。
                  • 另请参阅此相关但不相同 SO问题及其答案:stackoverflow.com/questions/2704597/iteration-order-of-hashset
                  • 一个HashSet迭代一次,然后再迭代一次,元素的顺序会保持不变。我知道规范中对此没有任何保证,但当前的实现可以做到这一点。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-09-25
                  • 2011-08-02
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多