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循环将以正确的顺序迭代,因为List
和syntactic sugar actually uses an iterator方法在stringCollection
中被覆盖以获得订单。由于List
的运行时类型是{{1}},因此它将使用从列表开头开始的重写方法。这是对的吗?
答案 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.iterator
由Collection
的JDK实现实现,如ArrayList
。这是面向对象编程如何工作所固有的;如果你调用一个只知道其中一个接口的对象的方法,它仍然会调用完全实现的类的方法。
答案 3 :(得分:0)
Collection
和List
接口都没有为iterate()
方法提供实现,因此这个实现必须来自您正在迭代的对象的运行时类型。所以是的,如果您使用有序列表,集合将以可预测的顺序迭代。