如果我迭代一个集合,它实际上是java中的一个列表,那么这个集合会有顺序吗? List-stringList; //以某种方式填充字符串 集合stringCollection=(集合)stringList; 用于(字符串str:stringCollection){ //是否保证该循环按照stringList中的顺序进行迭代 }
我认为可以保证每个循环都会以正确的顺序进行迭代,因为and方法在如果我迭代一个集合,它实际上是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真的是一个列表(运行时类
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
}