Java 数组列表检索顺序

Java 数组列表检索顺序,java,arraylist,Java,Arraylist,我有一个javaArrayList,其中添加了5个对象 如果我遍历列表并将其打印出来,然后遍历列表并再次打印出来 这两种情况下的检索顺序是否相同?(我知道它可能不同于插入顺序)如果不改变列表,那么迭代顺序将保持不变。列表具有契约指定的顺序,并且迭代器规范保证它以该顺序在元素上进行迭代。是,假设您没有在其间修改列表。发件人: 迭代器 Iterator Iterator() 按正确的顺序返回此列表中元素的迭代器 也许有点模糊,但在该页的其他部分,该术语的定义如下: 正确的顺序(从第一个元素到最后一个

我有一个java
ArrayList
,其中添加了5个对象

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


这两种情况下的检索顺序是否相同?(我知道它可能不同于插入顺序)

如果不改变列表,那么迭代顺序将保持不变。列表具有契约指定的顺序,并且
迭代器
规范保证它以该顺序在元素上进行迭代。

是,假设您没有在其间修改列表。发件人:

迭代器

Iterator Iterator()

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

也许有点模糊,但在该页的其他部分,该术语的定义如下:

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


如果不进行修改(添加或删除项目),即使是集合也会返回相同的结果。

列表
界面的规范中保留顺序


不保持顺序的是
集合
类。

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

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

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

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

不会的。
List
的契约要求
add
顺序与迭代顺序相同,因为
add
在末尾插入,而
iterator
生成一个从开始到结束依次迭代的迭代器

Set
不需要这个,因此您可能会混淆关于迭代顺序的
Set
List
的契约

从:

Iterator Iterator()

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


是的,
ArrayList
保证其元素的迭代顺序-也就是说,它们将以插入它们的相同顺序出现,如果您在迭代
ArrayList

时没有进行任何插入,那么只要列表没有发生变化,并且您使用相同的迭代器,检索顺序就保证是相同的,但必须依赖于检索顺序,这表明设计有点可疑。一般来说,将业务逻辑建立在特定的检索顺序上不是一个好主意。

他们本可以做得比说明“正确的顺序”更好:-)@TheNail-嗯,
List
的文档一开始就说
List
是“一个有序的集合(也称为序列)。”实际上,这通常是正确的,但这并不能保证(除了SortedSet!)。理论上,你可能会遇到一个在幕后重组其内部结构的集合……不能保证集合在任何时候都不会在内部重组。无法保证集合迭代将以任何特定的顺序进行,或者顺序不会从一个迭代器更改到下一个迭代器。另请参见这个相关但不相同的SO问题及其答案:只需将哈希集迭代一次,然后再次迭代,元素的顺序将保持不变。我知道规范中对此没有保证,但当前的实现就是这样做的。这个答案几乎是现有答案的重复。