Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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中的一个列表,那么这个集合会有顺序吗? List-stringList; //以某种方式填充字符串 集合stringCollection=(集合)stringList; 用于(字符串str:stringCollection){ //是否保证该循环按照stringList中的顺序进行迭代 }_Java_List_Loops_Inheritance_Collections - Fatal编程技术网

如果我迭代一个集合,它实际上是java中的一个列表,那么这个集合会有顺序吗? List-stringList; //以某种方式填充字符串 集合stringCollection=(集合)stringList; 用于(字符串str:stringCollection){ //是否保证该循环按照stringList中的顺序进行迭代 }

如果我迭代一个集合,它实际上是java中的一个列表,那么这个集合会有顺序吗? List-stringList; //以某种方式填充字符串 集合stringCollection=(集合)stringList; 用于(字符串str:stringCollection){ //是否保证该循环按照stringList中的顺序进行迭代 },java,list,loops,inheritance,collections,Java,List,Loops,Inheritance,Collections,我认为可以保证每个循环都会以正确的顺序进行迭代,因为and方法在List中被重写以获得顺序。由于stringCollection的运行时类型是一个列表,因此它将使用从列表开头开始的重写方法。这是正确的吗?是的。 Collection.iterator由Collection的JDK实现实现,如ArrayList。这是面向对象编程工作的固有特性;如果调用一个只知道其一个接口的对象的方法,它仍将调用完全实现的类的方法。是的,增强的for循环将使用所提供集合的迭代器。因此,如果b真的是一个列表(运行时类

我认为可以保证每个循环都会以正确的顺序进行迭代,因为and方法在
List
中被重写以获得顺序。由于
stringCollection
的运行时类型是一个
列表
,因此它将使用从列表开头开始的重写方法。这是正确的吗?

是的。
Collection.iterator
Collection
的JDK实现实现,如
ArrayList
。这是面向对象编程工作的固有特性;如果调用一个只知道其一个接口的对象的方法,它仍将调用完全实现的类的方法。

是的,增强的for循环将使用所提供集合的迭代器。因此,如果b真的是一个列表(运行时类型),那么顺序将得到保证

注意,对于新的流API(JavaSE8),这有点不同

虽然b.stream()仍能保证顺序,但b.parallelStream()不能

另请参见:

返回此集合中元素的迭代器。没有 关于元素返回顺序的保证 (除非此集合是提供 担保


无论是
集合
还是
列表
接口都没有为
iterate()
方法提供实现,因此此实现必须来自正在迭代的对象的运行时类型。因此,是的,如果使用有序列表,集合将以可预测的顺序迭代。

您尝试过吗?为它编写测试用例并不难。。如果你真的尝试了,会发生什么@posdef尝试它不会回答这个问题,如果这个行为得到保证。它将来自对象的运行时类型,即使Collection和List中有一个是抽象类,并且确实为
迭代器()
方法提供了实现。@durron597是这样吗?它们不是抽象类,所以这无关紧要。是的,但实现总是来自运行时类型。您说过“实现来自运行时类型,因为接口不提供实现”,但实际上实现来自运行时类型,不管发生什么。@durron597在本例中,它们是接口,因此实现没有其他来源,这就是我的观点。解释时不要使用引号。@BilltheLizard由于Java SE 8,接口可以指定默认实现,但对于迭代器方法,Collection、List和Iterable都不能指定默认实现。
List<String> stringList;

//fill with strings somehow

Collection<String> stringCollection = (Collection<String>) stringList;

for(String str : stringCollection){
  //will this loop be guaranteed to iterate in the order found in stringList
}