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