【发布时间】:2012-02-27 22:43:29
【问题描述】:
我有一个 java ArrayList 向其中添加 5 个对象。
如果我遍历列表并打印出来,然后遍历列表并再次打印出来。
这两种情况下的检索顺序会一样吗? (我知道它可能与插入顺序不同)
【问题讨论】:
我有一个 java ArrayList 向其中添加 5 个对象。
如果我遍历列表并打印出来,然后遍历列表并再次打印出来。
这两种情况下的检索顺序会一样吗? (我知道它可能与插入顺序不同)
【问题讨论】:
是的,假设您没有修改中间的列表。来自http://docs.oracle.com/javase/6/docs/api/java/util/List.html:
迭代器
Iterator<E> iterator()以正确的顺序返回此列表中元素的迭代器。
可能有点模糊,但在该页面的其他部分,该术语已定义:
正确的顺序(从第一个元素到最后一个元素)
【讨论】:
List 的文档一开始就说List 是“有序集合(也称为序列)。 "
(我知道它可能与插入顺序不同)
不,不会。 List 的合约要求 add 的顺序与迭代顺序相同,因为 add 在末尾插入,iterator 生成一个迭代器,按顺序从头到尾迭代。
Set 不需要这个,所以你可能会混淆Set 和List 关于迭代顺序的合同。
来自Javadoc:
Iterator<E> iterator()以正确的顺序返回此列表中元素的迭代器。
【讨论】:
在List接口的规范中保留了顺序。
是 Set 类不保持顺序。
【讨论】:
如果您不更改列表,则迭代顺序将保持不变。列表具有合同规定的顺序,iterator 规范保证它按该顺序迭代元素。
【讨论】:
是的,ArrayList 保证其元素的迭代顺序 - 也就是说,它们将以您插入它们的相同顺序出现,前提是您在迭代 ArrayList 时不进行任何插入。
【讨论】:
除非您更改正在使用的迭代器,否则检索不会改变。只要您使用相同的方法进行检索并且没有更改列表本身,那么项目将以相同的顺序返回。
【讨论】:
当您使用 add(E e) 将元素添加到 ArrayList 时,该元素将附加到列表的末尾。因此,如果您所做的只是多次调用单参数add 方法然后进行迭代,那么迭代的顺序将与调用add 的顺序完全相同。
【讨论】:
每次迭代相同的未修改列表时,迭代顺序都是相同的。
另外,假设您使用add() 方法添加元素,迭代顺序将与插入顺序相同,因为此方法将元素附加到列表的末尾。
【讨论】:
是的,只要列表没有发生突变并且您使用相同的迭代器,就可以保证检索顺序相同,但是必须依赖检索顺序表明设计存在问题。将业务逻辑建立在特定的检索顺序上通常不是一个好主意。
【讨论】:
如果您不修改它们(向其中添加或删除项目),即使 Set 也将返回相同的结果。
【讨论】: