The Java Iterator interface represents an object capable of iterating through a collection of Java objects, one object at a time. The Iterator interface is one of the oldest mechanisms in Java for iterating collections of objects (although not the oldest — Enumerator predated Iterator).
Moreover, an iterator differs from the enumerations in two ways:
1. Iterator permits the caller to remove the given elements from the specified collection during the iteration of the elements.
2. Method names have been enhanced.
Java
// Java program to illustrate Iterator interface import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class JavaIteratorExample1 { public static void main(String[] args) { // create a linkedlist List<String> list = new LinkedList<>(); // Add elements list.add( "Welcome" ); list.add( "to" ); list.add( "our" ); list.add( "website" ); // print the list to the console System.out.println( "The list is given as : " + list); // call iterator on the list Iterator<String> itr = list.iterator(); // itr.hasNext() returns true if there // is still an element next to the current // element pointed by iterator while (itr.hasNext()) { // Returns the next element. System.out.println(itr.next()); } // Removes the last element. itr.remove(); // print the list after removing an // element System.out.println( "After the remove() method is called : " + list); } } |
The list is given as : [Welcome, to, our, website] Welcome to our website After the remove() method is called : [Welcome, to, our]
Like Iterator and ListIterator, Spliterator is a Java Iterator, which is used to iterate elements one-by-one from a List implemented object.
The main functionalities of Spliterator are:
- Splitting the source data
- Processing the source data
The Interface Spliterator is included in JDK 8 for taking the advantages of parallelism in addition to sequential traversal. It is designed as a parallel analogue of an iterator.
Java
// Java program to illustrate a Spliterator import java.util.*; import java.util.stream.Stream; public class InterfaceSpliteratorExample { public static void main(String args[]) { // Create an object of array list ArrayList<Integer> list = new ArrayList<>(); // Add elements to the array list list.add( 101 ); list.add( 201 ); list.add( 301 ); list.add( 401 ); list.add( 501 ); // create a stream on the list Stream<Integer> str = list.stream(); // Get Spliterator object on stream Spliterator<Integer> splitr = str.spliterator(); // Get size of the list // encountered by the // forEachRemaining method System.out.println( "Estimate size: " + splitr.estimateSize()); // Print getExactSizeIfKnown // returns exact size if finite // or return -1 System.out.println( "Exact size: " + splitr.getExactSizeIfKnown()); // Check if the Spliterator has all // the characteristics System.out.println( "Boolean Result: " + splitr.hasCharacteristics( splitr.characteristics())); System.out.println( "Elements of ArrayList :" ); // print elements using forEachRemaining splitr.forEachRemaining( (n) -> System.out.println(n)); // Obtaining another Stream to the array list. Stream<Integer> str1 = list.stream(); splitr = str1.spliterator(); // Obtain spliterator using trySplit() method Spliterator<Integer> splitr2 = splitr.trySplit(); // If splitr can be partitioned use splitr2 first. if (splitr2 != null ) { System.out.println( "Output from splitr2: " ); splitr2.forEachRemaining( (n) -> System.out.println(n)); } // Now, use the splitr System.out.println( "Output from splitr1: " ); splitr.forEachRemaining( (n) -> System.out.println(n)); } } |
Estimate size: 5 Exact size: 5 Boolean Result: true Elements of ArrayList : 101 201 301 401 501 Output from splitr2: 101 201 Output from splitr1: 301 401 501
Difference between Iterator and Spliterator in java :
Iterator |
Spliterator |
---|---|
Introduced in Java 1.2 | Introduced in Java 1.8 |
Iterator only iterates elements individually | Spliterator traverse elements individually as well as in bulk |
It is an iterator for whole collection API | It is an iterator for both Collection and Stream API, except Map implementation classes |
It uses external iteration | It uses internal iteration. |
It is a Universal iterator | It is Not a Universal iterator |
It does not support parallel programming | It supports parallel programming by splitting the given element set so that each set can be processed individually. |