Java Iterator and ListIterator Example
Java Iterator is a public interface provided by java.util
package which belongs to Java Collections Framework
. It allows us to traverse a collection such as a List
(e.g. ArrayList
, LinkedList
) or a Set
and access the data element of this collection. An Iterator
can traverse the collection only in forward direction using next()
and hasNext()
methods and remove the last element returned by the iterator, using remove()
method. Here are common methods in the Iterator interface:
Iterator Method Signature | Description |
---|---|
E next () | Returns the next element in the iteration. |
boolean hasNext() | Returns true if the iteration has more elements. |
void remove() | Removes the last element returned by this iterator. |
void forEachRemainning (Consumer<T> action) | Performs the given action for each remaining element. |
Another object that is widely used for iterating a collection is ListIterator
, which is a public interface extending the Iterator
interface. A ListIterator
can traverse the collection in both directions by using the next()
and previous()
methods, find the index of the next or previous element of the collection by using the nextIndex()
or previousIndex()
methods, add a new element to any position in the collection by using add(E e)
method and remove an element from any position in the collection by using remove()
method. Here are the additional common methods in ListIterator interface.
ListIterator Method Signature | Description |
---|---|
E previous() | Returns the previous element in the iteration. |
boolean hasPrevious () | Returns true if the iteration has more previous elements. |
int nextIndex() | Returns the index of the next element. |
int previousIndex() | Returns the index of the previous element. |
void add(E e) | Inserts the specified element into the list. |
void remove() | Removes the last element returned by this iterator. |
void set(E e) | Replaces the specified element. |
1. Example of the Java Iterator and the Java ListIterator
Create a java class named IteratorExample.java
with the following code:
IteratorExample.java
package jcg.zheng.demo; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Set; public class IteratorExample { private static void addFiveElements(Collection<String> list) { list.add("One"); list.add("Two"); list.add("Three"); list.add("Four"); list.add("Five"); } private static void demoIterator_listIterator(List<String> list) { addFiveElements(list); iteratorWithforEachRemaining(list); iteratorWithWhileLoop(list); iteratorWithForLoop(list); listIteratorForwardsTraverse(list); listIteratorBackwardsTraverse(list); listIterator_replace_element(list); listIterator_add_remove(list); } private static void iterator_set(Set<String> items) { addFiveElements(items); Iterator<String> it = items.iterator(); System.out.println("Traversing set via Iterator"); while (it.hasNext()) { System.out.println(it.next()); } } private static void iteratorWithforEachRemaining(List<String> list) { System.out.println("Iterator using forEachRemaining: "); Iterator<String> it1 = list.iterator(); it1.forEachRemaining(System.out::println); } private static void iteratorWithForLoop(List<String> list) { System.out.println("Iterator using for loop: "); for (Iterator<String> it2 = list.iterator(); it2.hasNext();) { System.out.println("Next element: " + it2.next()); } } private static void iteratorWithWhileLoop(List<String> list) { System.out.println("Iterator using while loop: "); Iterator<String> it1 = list.iterator(); while (it1.hasNext()) { System.out.println("Next element: " + it1.next()); } } private static void listIterator_replace_element(List<String> list) { System.out.println("Add|Replace element: "); for (ListIterator<String> listIt = list.listIterator(); listIt.hasNext();) { String checkItem = listIt.next(); if ("Four".equalsIgnoreCase(checkItem)) { listIt.set("Replaced Four"); // replace the element the iterator is currently at } } System.out.println("Traverse with forEach: "); list.forEach(System.out::println); } private static void listIterator_add_remove(List<String> list) { ListIterator<String> lit = list.listIterator(0); lit.next(); lit.add("One more element"); System.out.println("Modified list after the insertion of the new element"); System.out.println("Index of next element: " + lit.nextIndex()); System.out.println("Index of previous element: " + lit.previousIndex()); for (lit = list.listIterator(); lit.hasNext();) { System.out.println("Next element: " + lit.next()); } lit.previous(); lit.remove(); System.out.println("Modified list after the removal of an element"); for (lit = list.listIterator(); lit.hasNext();) { System.out.println("Next element: " + lit.next()); } } private static void listIteratorBackwardsTraverse(List<String> list) { ListIterator<String> lit; System.out.println("List iterator (backward iteration): "); lit = list.listIterator(list.size()); while (lit.hasPrevious()) { System.out.println("Previous element: " + lit.previous()); } } private static void listIteratorForwardsTraverse(List<String> list) { System.out.println("List iterator (forward iteration): "); ListIterator<String> lit = list.listIterator(); while (lit.hasNext()) { System.out.println("Next element: " + lit.next()); } } public static void main(String args[]) { System.out.println("\nDemo with ArrayList\n"); demoIterator_listIterator(new ArrayList<String>()); System.out.println("\nDemo with LinkedList\n"); demoIterator_listIterator(new LinkedList<String>()); System.out.println("\nDemo with Set\n"); iterator_set(new HashSet<String>()); } }
Let’s explain the above code. Firstly, we create an ArrayList
of strings and we show two ways of iterating this ArrayList
using the Iterator
interface. In order to traverse the collection we must first obtain an iterator in this specific collection. Then, we use a loop mechanism which is valid as long as hasNext()
method of the Iterator returns true. This means that the collection has more elements and we haven’t reached the end of the collection. In this example, we show how to use the iterator along with the loop mechanisms while
and for loop
. In order to obtain each element of the ArrayList
we use the next()
method. We can only traverse the ArrayList
in forward direction.
Then we show how to use the ListIterator
interface, so as to depict the differences and the enhanced capabilities of this interface in relation with the Iterator interface. We iterate the arraylist in both directions and display the content of the ArrayList
in each case. Then, we add an element in next position of the current position of the iterator. Specifically, the iterator from the backwards iteration is currently at the first index of the ArrayList
, meanwhile at index 0. So, by calling lit.next()
we place the iterator at the second index of the ArrayList
, so the new element will be added in that position. Then, we display the index of next element and previous element. Finally, we remove the last element that was returned by lit.previous()
, which in this case was the last element in the list.
If we run the above code, we will have the following results:
Output
Demo with ArrayList Iterator using forEachRemaining: One Two Three Four Five Iterator using while loop: Next element: One Next element: Two Next element: Three Next element: Four Next element: Five Iterator using for loop: Next element: One Next element: Two Next element: Three Next element: Four Next element: Five List iterator (forward iteration): Next element: One Next element: Two Next element: Three Next element: Four Next element: Five List iterator (backward iteration): Previous element: Five Previous element: Four Previous element: Three Previous element: Two Previous element: One Add|Replace element: Traverse with forEach: One Two Three Replaced Four Five Modified list after the insertion of the new element Index of next element: 2 Index of previous element: 1 Next element: One Next element: One more element Next element: Two Next element: Three Next element: Replaced Four Next element: Five Modified list after the removal of an element Next element: One Next element: One more element Next element: Two Next element: Three Next element: Replaced Four Demo with LinkedList Iterator using forEachRemaining: One Two Three Four Five Iterator using while loop: Next element: One Next element: Two Next element: Three Next element: Four Next element: Five Iterator using for loop: Next element: One Next element: Two Next element: Three Next element: Four Next element: Five List iterator (forward iteration): Next element: One Next element: Two Next element: Three Next element: Four Next element: Five List iterator (backward iteration): Previous element: Five Previous element: Four Previous element: Three Previous element: Two Previous element: One Add|Replace element: Traverse with forEach: One Two Three Replaced Four Five Modified list after the insertion of the new element Index of next element: 2 Index of previous element: 1 Next element: One Next element: One more element Next element: Two Next element: Three Next element: Replaced Four Next element: Five Modified list after the removal of an element Next element: One Next element: One more element Next element: Two Next element: Three Next element: Replaced Four Demo with Set Traversing set via Iterator Five One Four Two Three
2. Summary
In this example, I demonstrated how to use Iterator
and ListIterator
interfaces to traverse a collection, access, add, and remove an element. Iterator
and ListIterator
are similar with the following differences:
- We can use
ListIterator
to traverse backwards and forwards but only forwards withIterator
. Iterator
can work onList
andSet
whileListIterator
can only work onList
.- We can obtain the element’s index while traversing with
ListIterator
. but not withIterator
. - We can add a new element at any point of time while traversing a list using
ListIterator
but we cannot do so withIterator
. - We can replace the existing element value when using
ListIterator
but we cannot do so withIterator
.
3. Download the source code
This was an example of how to use the Iterator
interface and show the differences from the ListIterator
interface.
You can download the Eclipse project from here: Java Iterator and ListIterator Example
Last updated on Feb. 3rd, 2020