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

时间:2011-02-11 17:59:11

标签: java collections arraylist

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

编辑:

以下是操作对传递给iterator标记的原始集合的作用:

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();
}

3 个答案:

答案 0 :(得分:10)

List仍然由原始数组支持,因此项目的显示顺序与数组中的顺序相同。

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

至于另一个方向,List的{​​{1}}

  

返回包含所有内容的数组   这个列表中的元素是正确的   序列(从第一个元素到最后一个元素)。

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

这样的事情并不罕见,使用String数组作为示例:

Object[]

(此示例取自String[] y = x.toArray(new String[0]); 的{​​{3}}

答案 1 :(得分:2)

如果collection是Map

,可能会抛出迭代的位置
 else if(collection instanceof Map) {
    iterator = ((Map) collection).entrySet().iterator();
}

如果collection特别是HashMap,则集合元素的顺序确实被抛到窗外。

如果collectionTreeMap 应该根据排序维护集合的顺序。但是,如果从Comparable对象数组中创建TreeMap,则不应该期望数组和TreeMap具有相同的顺序,因为TreeMap将对内容进行排序数组。

你还可以获得一些其他Collection,其中包括HashSetPriorityQueue等订单。

但是,如果collection永远不是地图而且始终是数组,那么Arrays.asList 应该维护订单。我最好的猜测是,您的问题不在您的代码段之外,或者在您传递数组的情况之外的其中一种情况。

答案 2 :(得分:0)

您可以将此Collection替换为Iterable

} else if(collection instanceof Iterable) {
    iterator = ((Iterable) collection).iterator()

注意:原始数组如int[].class.isArray() == true,但不能使用Object[]

进行投射