如果我遍历一个实际上是java中的列表的集合,该集合是否会有订单?

时间:2015-04-21 14:20:56

标签: java list loops inheritance collections

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
}

我认为保证这个for-each循环将以正确的顺序迭代,因为Listsyntactic sugar actually uses an iterator方法在stringCollection中被覆盖以获得订单。由于List的运行时类型是{{1}},因此它将使用从列表开头开始的重写方法。这是对的吗?

4 个答案:

答案 0 :(得分:2)

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

请注意,使用新的流API(Java SE 8)时,这有点不同。

虽然b.stream()仍会保证订单,但b.parallelStream()不会。

另见:https://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html#ordering

答案 1 :(得分:2)

http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#iterator()

  

返回此集合中元素的迭代器。没有   关于元素返回顺序的保证   (除非此集合是某个提供a的类的实例   保证)。

答案 2 :(得分:1)

Collection.iteratorCollection的JDK实现实现,如ArrayList。这是面向对象编程如何工作所固有的;如果你调用一个只知道其中一个接口的对象的方法,它仍然会调用完全实现的类的方法。

答案 3 :(得分:0)

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