Does Java's for-each call an embedded method (that returns the collection) for every iteration?

前端 未结 4 1137
借酒劲吻你
借酒劲吻你 2021-02-03 20:41

If there is a method call MyClass.returnArray() and I iterate over the array using the for-each construct (also called the \"enhanced for\" loop):

f         


        
相关标签:
4条回答
  • 2021-02-03 21:09

    No.

    The for loop is just syntactic sugar. It behaves differently depending on whether or not it is applied to an Array argument or an object implementing the Iterable interface.

    For Iterable objects, the loop expands to something like this:

    Iterator<ArrayElement> iter = iterableObject.iterator();
    while (iter.hasNext()) {
       ArrayElement e = iter.next();
       // do smth
    }
    

    What your example code is actually doing is something like this:

    Object[] temp = Method.returnArray();
    for ( int i = 0; i < temp.length; i++ ) {
      ArrayElement e = (ArrayElement) temp[i];
      // do smth
    }     
    
    0 讨论(0)
  • 2021-02-03 21:15

    From the java language spec:

    EnhancedForStatement:
        for ( VariableModifiersopt Type Identifier: Expression) Statement
    

    and later on:

    T[] a = Expression;
    L1: L2: ... Lm:
    for (int i = 0; i < a.length; i++) {
            VariableModifiersopt Type Identifier = a[i];
            Statement
    }
    

    This is (in pseudo code) the equivalent of the advanced for loop for arrays. And it is made clear, that the Expression is evaluated once and the resulting array is assigned to T[] a.

    So it's perfectly safe to use even complex expressions in the advanced for loop statement.

    0 讨论(0)
  • 2021-02-03 21:20

    No, it won't. The result of the first call will be stored in the compiled code in a temporary variable.

    From Effective Java 2nd. Ed., Item 46:

    Note that there is no performance penalty for using the for-each loop, even for arrays. In fact, it may offer a slight performance advantage over an ordinary for loop in some circumstances, as it computes the limit of the array index only once.

    0 讨论(0)
  • 2021-02-03 21:30

    No, it will be called once. It's not like the termination condition of a standard for loop, which gets evaluated on every iteration.

    0 讨论(0)
提交回复
热议问题