Java 的 foreach 循环能保持顺序吗?

Java 的 foreach 循环是从第一个对象开始,并以线性方式工作到最后吗?比如说

String[] names = new String[] {"Zoe", "Bob", "Charlie", "Alex"};
for(String name : names) {
//do stuff...
}

字符串“ Zoe”总是先处理,然后是“ Bob”等吗?没有分类吗?我亲自测试过,没有发现任何问题,但我需要一个保证,在文件中找不到任何答案。

48046 次浏览

是的。顺序没有改变。这适用于实现 for 循环使用的 迭代器接口Java 集合框架的所有类型的集合。如果要对 Array 进行排序,可以使用 Sort (名称)

增强的 for循环在 JLS 14.14.2中指定,其等效代码在 JLS 14.14.2中编写。

它可以用来遍历 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#i是自动生成的标识符,这些标识符不同于在增强的 for 语句发生的位置处于作用域内的任何其他标识符(自动生成或以其他方式生成)。

  • 对于 Iterable,它将遵循相应的 Iterator(通过调用 Iterable.iterator()检索)的顺序,这在运行之间可能是一致的,也可能是不一致的。

    增强的 for 表格相当于基本的 for 表格:

    for (I #i = Expression.iterator(); #i.hasNext(); ) {
    {VariableModifier} TargetType Identifier =
    (TargetType) #i.next();
    Statement
    }
    

    #i是一个自动生成的标识符,它不同于发生增强 for 语句时作用域(6.3)中的任何其他标识符(自动生成或其他)。

    您应该引用每种类型的 Javadoc 来查看订单是否一致。例如,显式地指定对于 List,迭代器保留顺序:

    以适当的顺序返回此列表中元素的迭代器。

    它显式地指定对于 Set,订单是未指定的(除非作出额外的保证):

    元素不按特定顺序返回(除非这个集合是某个提供保证的类的实例)。