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

时间:2016-01-26 09:43:32

标签: java foreach

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

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

首先处理字符串“Zoe”,然后是“Bob”等吗?没有排序?我自己测试了一下,但没有找到,但我需要保证,在文档中找不到任何内容。

2 个答案:

答案 0 :(得分:39)

是。订单不会改变。这适用于实现for循环使用的Java Collection Framework iterator interface的所有类型的集合。如果要对数组进行排序,可以使用Arrays.sort(names)

答案 1 :(得分:32)

增强的for循环在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来查看订单是否一致。例如,it is explicitely specified that for List, the iterator retains the order

      

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

    it is explicitely specified that for Set, the order is unspecified (unless an extra guarantee is made)

      

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