Java Tutorial
Operators
Flow Control
String
Number and Date
Built-in Classes
Array
Class and Object
Inheritance and Polymorphism
Exception Handling
Collections, Generics and Enumerations
Reflection
Input/Output Stream
Annotation
In Java, an Iterator
is an interface that provides a way to traverse collection elements sequentially. It is part of the java.util
package and can be used with various collection types, including List
, Set
, and Map
. An Iterator
object allows you to traverse the elements in a collection one by one, and it provides methods to check if there are more elements and to remove elements.
Here's how to use an Iterator
to iterate over various collections in Java:
List
:import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Main { public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("John"); names.add("Alice"); names.add("Bob"); Iterator<String> iterator = names.iterator(); while (iterator.hasNext()) { String name = iterator.next(); System.out.println(name); } } }
Set
:import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class Main { public static void main(String[] args) { Set<String> colors = new HashSet<>(); colors.add("Red"); colors.add("Green"); colors.add("Blue"); Iterator<String> iterator = colors.iterator(); while (iterator.hasNext()) { String color = iterator.next(); System.out.println(color); } } }
Map
using its entrySet
:import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class Main { public static void main(String[] args) { Map<String, Integer> ages = new HashMap<>(); ages.put("John", 25); ages.put("Alice", 30); ages.put("Bob", 22); Iterator<Map.Entry<String, Integer>> iterator = ages.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry<String, Integer> entry = iterator.next(); System.out.println(entry.getKey() + " is " + entry.getValue() + " years old"); } } }
Map
using its keySet
and get
method:import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class Main { public static void main(String[] args) { Map<String, Integer> ages = new HashMap<>(); ages.put("John", 25); ages.put("Alice", 30); ages.put("Bob", 22); Iterator<String> iterator = ages.keySet().iterator(); while (iterator.hasNext()) { String name = iterator.next(); System.out.println(name + " is " + ages.get(name) + " years old"); } } }
In conclusion, the Iterator
interface in Java provides a way to traverse collection elements sequentially. It can be used with various collection types, including List
, Set
, and Map
, to iterate through their elements one by one. Additionally, the Iterator
allows you to check if there are more elements in the collection and provides a method to remove elements during the iteration.
Iterating over collections with Iterator in Java:
The Iterator
interface provides a way to iterate over elements in a collection.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); Iterator<String> iterator = names.iterator(); while (iterator.hasNext()) { String name = iterator.next(); System.out.println(name); }
Using Iterator to traverse ArrayList in Java:
ArrayLists can be traversed using the Iterator
interface.
List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); Iterator<Integer> iterator = numbers.iterator(); while (iterator.hasNext()) { int num = iterator.next(); System.out.println(num); }
Working with Set and Map using Iterator in Java:
Sets and Maps can also be traversed using the Iterator
interface.
Set<String> set = new HashSet<>(Arrays.asList("apple", "orange", "banana")); Iterator<String> setIterator = set.iterator(); while (setIterator.hasNext()) { String fruit = setIterator.next(); System.out.println(fruit); }
Map<String, Integer> map = new HashMap<>(); map.put("one", 1); map.put("two", 2); map.put("three", 3); Iterator<Map.Entry<String, Integer>> mapIterator = map.entrySet().iterator(); while (mapIterator.hasNext()) { Map.Entry<String, Integer> entry = mapIterator.next(); System.out.println(entry.getKey() + ": " + entry.getValue()); }
Removing elements while iterating with Iterator in Java:
Elements can be removed from a collection using the remove
method of the Iterator
.
List<String> names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie")); Iterator<String> iterator = names.iterator(); while (iterator.hasNext()) { String name = iterator.next(); if (name.equals("Bob")) { iterator.remove(); // Removes "Bob" from the list } }
Bidirectional iteration with ListIterator in Java:
ListIterator
allows bidirectional iteration and modification of elements in a list.
List<String> colors = new ArrayList<>(Arrays.asList("Red", "Green", "Blue")); ListIterator<String> listIterator = colors.listIterator(); while (listIterator.hasNext()) { String color = listIterator.next(); System.out.println(color); } while (listIterator.hasPrevious()) { String color = listIterator.previous(); System.out.println(color); }
Custom classes and Iterator in Java:
Custom classes can implement the Iterable
interface to enable iteration.
public class MyCollection implements Iterable<String> { private List<String> items = new ArrayList<>(); public void addItem(String item) { items.add(item); } @Override public Iterator<String> iterator() { return items.iterator(); } } // Usage MyCollection collection = new MyCollection(); collection.addItem("Item 1"); collection.addItem("Item 2"); Iterator<String> customIterator = collection.iterator(); while (customIterator.hasNext()) { String item = customIterator.next(); System.out.println(item); }
Iterating through a LinkedList with Iterator in Java:
LinkedLists can be traversed using the Iterator
interface.
LinkedList<Double> prices = new LinkedList<>(Arrays.asList(10.5, 20.0, 15.75)); Iterator<Double> iterator = prices.iterator(); while (iterator.hasNext()) { double price = iterator.next(); System.out.println(price); }
Java Iterator and ConcurrentModificationException:
Modifying a collection directly while using an iterator can lead to ConcurrentModificationException
.
List<String> names = new ArrayList<>(Arrays.asList("Alice", "Bob", "Charlie")); Iterator<String> iterator = names.iterator(); while (iterator.hasNext()) { String name = iterator.next(); if (name.equals("Bob")) { names.remove(name); // ConcurrentModificationException } }
Filtering elements with Iterator and Predicate in Java:
Java 8 introduced the Predicate
interface, which can be used with the Iterator
to filter elements.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); Iterator<String> iterator = names.iterator(); while (iterator.hasNext()) { String name = iterator.next(); if (name.length() > 3) { iterator.remove(); } }
Java Iterator and Iterable interface:
The Iterable
interface provides a way for collections to return an iterator.
public class MyIterable implements Iterable<Integer> { private List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); @Override public Iterator<Integer> iterator() { return numbers.iterator(); } } // Usage MyIterable iterable = new MyIterable(); for (int num : iterable) { System.out.println(num); }
Java streams and Iterator for collection processing: Java streams provide a more functional approach for collection processing.
List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); names.stream() .filter(name -> name.length() > 3) .forEach(System.out::println);