For-each loop in Java
Prerequisite: Decision making in Java
For-each is another array traversing technique like for loop, while loop, do-while loop introduced in Java5.
- It starts with the keyword for like a normal for-loop.
- Instead of declaring and initializing a loop counter variable, you declare a variable that is the same type as the base type of the array, followed by a colon, which is then followed by the array name.
- In the loop body, you can use the loop variable you created rather than using an indexed array element.
- It’s commonly used to iterate over an array or a Collections class (eg, ArrayList)
Syntax:
for (type var : array) { statements using var; }
Simple program with for each loop:
Java
/*package whatever //do not write package name here */ import java.io.*; class Easy { public static void main(String[] args) { // array declaration int ar[] = { 10 , 50 , 60 , 80 , 90 }; for ( int element : ar) System.out.print(element + " " ); } } |
Output
10 50 60 80 90
The above syntax is equivalent to:
for (int i=0; i<arr.length; i++) { type var = arr[i]; statements using var; }
Java
// Java program to illustrate // for-each loop class For_Each { public static void main(String[] arg) { { int [] marks = { 125 , 132 , 95 , 116 , 110 }; int highest_marks = maximum(marks); System.out.println( "The highest score is " + highest_marks); } } public static int maximum( int [] numbers) { int maxSoFar = numbers[ 0 ]; // for each loop for ( int num : numbers) { if (num > maxSoFar) { maxSoFar = num; } } return maxSoFar; } } |
Output
The highest score is 132
Limitations of for-each loop
decision-making
- For-each loops are not appropriate when you want to modify the array:
for (int num : marks) { // only changes num, not the array element num = num*2; }
2. For-each loops do not keep track of index. So we can not obtain array index using For-Each loop
for (int num : numbers) { if (num == target) { return ???; // do not know the index of num } }
3. For-each only iterates forward over the array in single steps
// cannot be converted to a for-each loop for (int i=numbers.length-1; i>0; i--) { System.out.println(numbers[i]); }
4. For-each cannot process two decision making statements at once
// cannot be easily converted to a for-each loop for (int i=0; i<numbers.length; i++) { if (numbers[i] == arr[i]) { ... } }
5. For-each also has some performance overhead over simple iteration:
Java
/*package whatever //do not write package name here */ import java.io.*; import java.util.*; class GFG { public static void main (String[] args) { List<Integer> list = new ArrayList<>(); long startTime; long endTime; for ( int i = 0 ; i < 1000000 ; i++) { list.add(i); } // Type 1 startTime = Calendar.getInstance().getTimeInMillis(); for ( int i : list) { int a = i; } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println( "For each loop :: " + (endTime - startTime) + " ms" ); // Type 2 startTime = Calendar.getInstance().getTimeInMillis(); for ( int j = 0 ; j < list.size(); j++) { int a = list.get(j); } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println( "Using collection.size() :: " + (endTime - startTime) + " ms" ); // Type 3 startTime = Calendar.getInstance().getTimeInMillis(); int size = list.size(); for ( int j = 0 ; j < size; j++) { int a = list.get(j); } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println( "By calculating collection.size() first :: " + (endTime - startTime) + " ms" ); // Type 4 startTime = Calendar.getInstance().getTimeInMillis(); for ( int j = list.size()- 1 ; j >= 0 ; j--) { int a = list.get(j); } endTime = Calendar.getInstance().getTimeInMillis(); System.out.println( "Using [int j = list.size(); j > size ; j--] :: " + (endTime - startTime) + " ms" ); } } // This code is contributed by Ayush Choudhary @gfg(code_ayush) |
Output
For each loop :: 45 ms Using collection.size() :: 11 ms By calculating collection.size() first :: 13 ms Using [int j = list.size(); j > size ; j--] :: 15 ms
Related Articles:
For-each in C++ vs Java
Iterator vs For-each in Java