Ways to iterate over a list in Java
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.
In Java, iterating over a list is one of the most fundamental and frequently performed operations. Java provides several methods to traverse through the list elements, each suited to different scenarios and requirements. Here, we explore various ways to iterate over a list, providing both technical explanations and practical examples.
Using the for loop
The traditional for loop is perhaps the simplest method to iterate over all elements in a list. It uses an index to access each element.
This approach offers precise control over the iteration process, such as the ability to start, skip certain elements, or stop before the end of the list.
Using the enhanced for loop
The enhanced for loop (also known as the "for-each" loop) introduced in Java 5 is a more concise and readable way to iterate over a list when you need to access each element but do not need the index.
This method is internally implemented using an iterator and is preferred for its simplicity when the index is not required.
Using an Iterator
The Iterator interface provides a way to traverse a collection element by element. It is particularly useful when you need to remove elements while iterating.
Using a ListIterator
The ListIterator extends Iterator to allow bidirectional traversal of a list and the modification of elements.
Using forEach() with Lambda Expression
Introduced in Java 8, the forEach() method combined with lambda expressions provides a very readable and concise way to iterate over a list.
This method is internally implemented using an iterator and is extremely useful for executing a single operation on all elements of a collection.
Using Stream API
Java 8 also introduced the Stream API, which enables functional-style operations on streams of elements. The stream() method followed by the forEach() method provides another way to iterate over a list.
This approach is not only concise but also supports parallel execution using parallelStream().
Summary Table
| Method | Use Case | Pros | Cons |
| Traditional for loop | Need index; custom start and end; skip elements | Full control over iteration | Verbose; error-prone |
| Enhanced for loop | Access each element without modifying the list | Readable; Less error-prone | No access to index |
| Iterator | Remove elements during iteration | Safe removal during iterate | Slightly verbose |
| ListIterator | Bidirectional access and modification of list | Flexible | More complex usage |
| forEach with Lambda | Simpler cases; modern, functional programming style | Highly readable | Limited functionality |
| Stream API | Functional style operations; possible parallelism | Concise; powerful capabilities | Overhead for small lists |
Each iteration method presented has its own benefits and drawbacks, making it essential for Java developers to choose the right one based on their specific needs and circumstances. Understanding these options enhances coding efficiency and effectiveness when working with list data structures in Java.
Related reading
- Weighted bipartite matching
- Weighted Quick-Union with Path Compression algorithm
- Weighted random selection from array
- What actually causes a Stack Overflow error?
- Ways to make maven build faster?
- WEB-INF not included in WebApp using SpringBoot, Spring-MVC and Maven
- What additional rotation is required for deletion from a Top-Down 2-3-4 Left-leaning Red Black tree?
- What algorithm can calculate the power set of a given set?

DSA Fundamentals
Master algorithmic patterns and data structures through hands-on LeetCode-style problems - from arrays and hashing to dynamic programming and advanced graphs.
View the courseTrack what you have practised
A free account saves your progress, solutions and study plan across every problem on Codemia.
Data Structures & Algorithms practice on Codemia
Step through 300 algorithm problems with animated visualisers that show the data structure changing as the code runs.