Java 的 foreach 循环是否保留了顺序?

2022-08-31 13:30:52

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

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

字符串“Zoe”是否总是首先处理,然后是“Bob”等?没有发生排序?我自己测试过,没有找到任何东西,但我需要保证,在文档中找不到任何东西。


答案 1

是的。顺序不会更改。这适用于实现 for 循环使用的迭代器接口Java 集合框架的所有类型的集合。如果要对数组进行排序,可以使用 Arrays.sort(names)


答案 2

增强型循环在 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,但顺序是未指定的(除非做出额外的保证):

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