Java 的 foreach 循环是否保留了顺序?
Java的foreach循环是否从第一个对象开始,并以线性方式工作到最后?例如
String[] names = new String[] {"Zoe", "Bob", "Charlie", "Alex"};
for(String name : names) {
//do stuff...
}
字符串“Zoe”是否总是首先处理,然后是“Bob”等?没有发生排序?我自己测试过,没有找到任何东西,但我需要保证,在文档中找不到任何东西。
Java的foreach循环是否从第一个对象开始,并以线性方式工作到最后?例如
String[] names = new String[] {"Zoe", "Bob", "Charlie", "Alex"};
for(String name : names) {
//do stuff...
}
字符串“Zoe”是否总是首先处理,然后是“Bob”等?没有发生排序?我自己测试过,没有找到任何东西,但我需要保证,在文档中找不到任何东西。
增强型循环在 JLS 14.14.2 中指定,其中编写了等效代码。for
它可用于循环访问 的数组和实例。Iterable
对于数组,迭代顺序将始终保留,并且在运行之间保持一致。这是因为它等效于一个简单的循环,其索引从数组的开头到其结尾。for
增强的 for 语句等效于以下形式的基本 for 语句:
T[] #a = Expression; L1: L2: ... Lm: for (int #i = 0; #i < #a.length; #i++) { {VariableModifier} TargetType Identifier = #a[#i]; Statement }
#a并且是自动生成的标识符,这些标识符与在发生增强 for 语句时作用域内的任何其他标识符(自动生成或以其他方式)不同。#i
对于 ,它将遵循相应的顺序(通过调用 Iterable.iterator()检索),该顺序在运行之间可能一致,也可能不一致。IterableIterator
增强的 for 语句等效于以下形式的基本 for 语句:
for (I #i = Expression.iterator(); #i.hasNext(); ) { {VariableModifier} TargetType Identifier = (TargetType) #i.next(); Statement }
#i是自动生成的标识符,与在发生增强 for 语句时作用域 (§6.3) 中的任何其他标识符(自动生成或以其他方式)不同。
您应该参考每种类型的Javadoc,以查看订单是否一致。例如,显式指定对于 List,迭代器保留以下顺序:
按正确的顺序返回对此列表中的元素的迭代器。
虽然明确指定了对于 Set,但顺序是未指定的(除非做出额外的保证)::
元素不按特定顺序返回(除非此集合是提供保证的某个类的实例)。