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