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:
/*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 + " " );
}
} |
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 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;
}
} |
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:
/*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) |
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