Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Arrays.asList返回的列表是否与原始数组集合保持相同的顺序?_Java_Collections_Arraylist - Fatal编程技术网

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

Java 从Arrays.asList返回的列表是否与原始数组集合保持相同的顺序?,java,collections,arraylist,Java,Collections,Arraylist,我有一个ArrayList,我迭代了几次,看起来它没有保持迭代的顺序。我看得更深入一些,似乎是(由其他人)为此迭代编写的自定义迭代器标记首先获取传入的ArrayList,并在迭代之前使用Arrays.asList将其桥接到Object[]集合。迭代的顺序丢失了吗?Arrays.asList需要这样做吗 编辑: 下面是该操作对传递到迭代器标记的原始集合所做的操作: if(collection.getClass().isArray()) { iterator = Arrays.asList(

我有一个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();
}

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

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

至于另一个方向,
List
toArray

返回包含所有 此列表中的元素以正确的方式显示 顺序(从第一个元素到最后一个元素)

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

以字符串数组为例,类似这样的情况并不少见:

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

(此示例取自for
列表

如果
集合
是一个映射,则可能会抛出迭代

 else if(collection instanceof Map) {
    iterator = ((Map) collection).entrySet().iterator();
}
如果
collection
是一个特定的集合,那么集合元素的顺序确实会被抛出窗口

如果
集合
是一个集合,则它应根据排序维护集合的顺序。但是,如果使用对象数组生成树映射,则不应期望数组和树映射具有相同的顺序,因为树映射将对数组的内容进行排序

你也可能会得到一些其他的
收藏
,它们会破坏你的订单等等


但是,如果
collection
永远不是一个映射,而是一个数组,
Arrays.asList
应该维护顺序。我的最佳猜测是,您的问题要么在代码片段之外,要么在传递数组之外的某个情况下。

您可以将
集合
替换为
可编辑

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

注意:像
int[].class.isArray()==true
,但它们不能与
Object[]

一起强制转换在您的案例中顺序丢失了吗?看起来是这样,但我试图指出原因,或者这是否是我如何构建UI的问题,而不是迭代本身的问题。我正在使用的自定义迭代器至少“很难”说。如果混淆了一些东西,该方法会检查集合是否是数组,是否将其包装在列表中,如果集合是您声称的Arraylist,则它只返回迭代器,请查看集合部分的实例。即使对象已备份,迭代现在通过对象[],这就是为什么我认为它可能会失去迭代顺序。@hal10001:等等。。。这不是在使用
List
toArray()
而不是
数组吗。asList()
?我添加了一些代码,以便更好地评估原始集合中发生的情况。@hal:什么时候数组中的项没有排序了?它们是按索引排序的,对吗?你不是在什么地方被hashmaps/hashset/hashtables搞糊涂了吗?@hal10001:我想你是被搞糊涂了。。。如果将
ArrayList
提供给作为
collection
发布的代码,则其
迭代器将直接使用,因为它是
collection
的实例。如果为该代码提供了数组,
Arrays.asList
将用于将该数组连接到
List
,而不是反过来。我刚刚意识到。。。如果我有一个树映射,然后它被转换成一个映射,那么迭代顺序就丢失了,不是吗?@hal10001如果它是一个树映射,那么迭代顺序就不应该丢失(仅仅因为你把树映射当作一个映射,并不意味着它就失去了树映射的特性)。如果是这样的话,我现在有点困惑:-p@hal10001:强制转换不会改变对象的行为或结构,它只会改变您将该对象称为的类型。@hal10001,如科林所说。仅仅因为我把灰熊叫做“熊”,并不意味着它不再是灰熊了。据附近的每个人所知,这是一个熊。感谢ColinD的直截了当的澄清。我正在使用一个API,该API是多年前由其他人在JAR文件中开发的,因此很遗憾,我无法更改迭代器标记的实现。