我有一个我正在迭代几次的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();
}
答案 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,则集合元素的顺序确实被抛到窗外。
如果collection
是TreeMap, 应该根据排序维护集合的顺序。但是,如果从Comparable对象数组中创建TreeMap,则不应该期望数组和TreeMap具有相同的顺序,因为TreeMap将对内容进行排序数组。
你还可以获得一些其他Collection
,其中包括HashSet,PriorityQueue等订单。
但是,如果collection
永远不是地图而且始终是数组,那么Arrays.asList
应该维护订单。我最好的猜测是,您的问题不在您的代码段之外,或者在您传递数组的情况之外的其中一种情况。
答案 2 :(得分:0)
您可以将此Collection
替换为Iterable
。
} else if(collection instanceof Iterable) {
iterator = ((Iterable) collection).iterator()
注意:原始数组如int[].class.isArray() == true
,但不能使用Object[]