Iteration meaning
Iteration means traversing through the elements of a collection or an array one by one.
This is generally required when you want to display the elements one by one or search for a particular element in the collection.


What is an iterator
An iterator is used to iterate(or loop) over the elements of a collection. Using an iterator, you can traverse through the elements of a collection one by one.
Though a collection can also be iterated by using a loop(such as for or while) but in case you want to remove elements from a collection during iteration, then iterator is the only choice(shown below).
An iterator in java is an object that implements java.util.Iterator interface.
An iterator always iterates over a collection in forward order, you cannot reverse the order of iteration using an iterator.
Getting iterator
All collection classes provide an iterator using iterate method. That is, by calling iterate method on a list, set or queue, you can get an iterator over them.
iterate method is available to all collection classes that implement java.util.Collection interface. This is because iterate method is declared in java.util.Collection interface.
Map classes do not implement this interface, hence they do not have iterate method. Though they can be iterated indirectly using an iterator(shown later in this post).

Arrays cannot be iterated using an iterator.

Iterator Over List

As mentioned above, an iterator can be used to iterate over a list, set or a queue. Once you get an iterator over the collection to be iterated(or traversed), use its hasNext() and next() methods for iteration.
hasNext() method determines whether there is an element remaining in the collection for iteration. It returns true if there is at least one element left to be iterated.
next() method returns the current element of the collection where the iterator is positioned.

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListIteratorExample {

  public static void main(String[] args) {
    // create a list
    List list = new ArrayList();
    // add elements
    list.add("orange");
    list.add("mango");
    list.add("papaya");
    // get iterator over the list
    Iterator iterator = list.iterator();
    // iterate over the list
    while (iterator.hasNext()) {
      // get current element
      String element = iterator.next();
      System.out.println(element);
    }
  }
}

Output of above program is

mango
orange
guava

Note that iterator can be generic with its type the same as the type of collection on which it is iterating.
List in the above example has a generic type of String, that it why the iterator also has the same generic type.
Set iterator example
Just like a list iterator, iteration over a set can also be performed as shown below.

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class SetIteratorExample {

  public static void main(String[] args) {
    // create a set
    Set set = new HashSet();
    // add elements
    set.add("orange");
    set.add("mango");
    set.add("papaya");
    // get iterator over the set
    Iterator iterator = set.iterator();
    // iterate over the set
    while (iterator.hasNext()) {
      // get current element
      String element = iterator.next();
      System.out.println(element);
    }
  }
}

Output of above program is

mango
orange
guava

Iterate Map example
An iterator over a map cannot be obtained directly but over its set of keys or values which can then be used for iteration as shown in the below example.

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
 
public class MapIteratorExample {
  public static void main(String[] args) {
    // create a hashmap
    Map<Integer, String> map = new HashMap<Integer, String>();
    // add values
    map.put(1, "mango");
    map.put(2, "orange");
    map.put(3, "guava");
    // get iterator over the keys of map
    Iterator iterator = map.keySet().iterator();
    // iterate over map key
    while (iterator.hasNext()) {
      // get current map key
      Integer key = iterator.next();
      System.out.println("Key: " + key);
      // get value of this key
      System.out.println("Value: " + map.get(key));
    }
  }
}

Above code produces below output

Key: 1
Value: mango
Key: 2
Value: orange
Key: 3
Value: guava

A map can be iterated in many different ways. Check out all those here.

Removing elements using iterator
An iterator can be used to remove elements from a collection while iterating over it using remove method. This method will remove the element at which the iterator is currently positioned.
In other words, remove method of iterator will delete the element returned by its next method.

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class RandomNumberGenerator {

  public static void main(String[] args) {
    // create a set
    Set set = new HashSet();
    // add elements
    set.add("orange");
    set.add("mango");
    set.add("papaya");
    // get iterator over the set
    Iterator iterator = set.iterator();
    // first element index
    int currentElementIndex = 0;
    System.out.println("Set before iteration: " + set);
    // iterate over the set
    while (iterator.hasNext()) {
      iterator.next();
      // remove second element 
      if(currentElementIndex == 1) {
        iterator.remove();
      }
     // increase element index
     ++currentElementIndex;
    }
    System.out.println("Set after iteration: " + set);
  }
}

Above code iterates over the set and removes its second element which is clear from the below output.

Set before iteration: [orange, papaya, mango]
Set after iteration: [orange, mango]

Note that this is the advantage of using an iterator that it can remove elements during iteration. If you are using a loop to iterate over a set or list and use the set’s remove method, then it will throw a java.util.ConcurrentModificationException.

 

More on ConcurrentModification exception here.

remove method will throw a java.lang.IllegalStateException if it is called before next is called. This makes sense because till the time next is not called, the iterator is not pointing to any element that it could remove.

In the above example, comment out or delete the statement iterator.next and this exception will be raised.

If you are creating your own custom collection class and want it to be iterated using an iterator, then make your class implement java.util.Iterable interface.

Hope this post about iterator in java was useful.