从 Arrays.asList 返回的列表是否与原始数组集合保持相同的顺序?

2022-09-03 02:28:26

我有一个ArrayList,我正在迭代几次,它看起来没有保持迭代的顺序。我看了更深,似乎为此迭代(由其他人)编写的自定义迭代器标记首先在ArrayList中采用传递的标记,并在迭代之前使用Arrays.asList将其桥接到Object[]集合。迭代的顺序是否丢失了?Arrays.asList 是否预料到这一点?

编辑:

以下是该操作对传递到迭代器标记中的原始集合执行的操作:

if(collection.getClass().isArray()) {
    iterator = Arrays.asList((Object[]) collection).iterator();
} else if(collection instanceof Collection) {
    iterator = ((Collection) collection).iterator();
} else if(collection instanceof Iterator) {
    iterator = (Iterator) collection;
} else if(collection instanceof Map) {
    iterator = ((Map) collection).entrySet().iterator();
}

答案 1

List 仍由原始数组支持,因此项的显示顺序应与它们在数组中的显示顺序相同。

另请注意,asList 是一个泛型方法,因此将返回 .Arrays.asList(T[])List<T>

至于另一个方向,'ListtoArray

返回一个数组,其中包含此列表中按正确顺序(从第一个元素到最后一个元素)的所有元素。

有两种 toArray 方法。第一个返回一个 ,第二个以数组作为其参数,并返回为相同类型的数组。Object[]

像这样的事情并不少见,以 String 数组为例:

String[] y = x.toArray(new String[0]);

(此示例取自 JavaDocList<E>)


答案 2

迭代被抛弃的地方可能是如果是Mapcollection

 else if(collection instanceof Map) {
    iterator = ((Map) collection).entrySet().iterator();
}

如果是特定的HashMap,则集合元素的顺序确实被扔出了窗口。collection

如果 是 树状图则应根据排序来维护集合的顺序。但是,如果从可比较对象的数组中创建树状图,则不应期望数组和树状图具有相同的顺序,因为树状图将对数组的内容进行排序。collection

你也可能得到一些其他的,它会像HashSetPriorityQueue等顺序一起混乱。Collection

但是,如果从来不是映射,并且始终是数组,则应保持顺序。我最好的猜测是,您的问题要么在您的代码片段之外,要么存在于您传递数组之外的其中一种情况下。collectionArrays.asList