patternjavaCritical
Ways to iterate over a list in Java
Viewed 0 times
javaoveriteratewayslist
Problem
Being somewhat new to the Java language I'm trying to familiarize myself with all the ways (or at least the non-pathological ones) that one might iterate through a list (or perhaps other collections) and the advantages or disadvantages of each.
Given a
Basic for loop (of course, there're equivalent
Note: As @amarseillan pointed out, this form is a poor choice
for iterating over
the
For example,
the elements preceding i to get the i-th element.
In the above example there's no way for the
"save its place" to make future iterations more efficient.
For an
For more information about the computational complexity of the built-in
Enhanced for loop (nicely explained in this question)
Iterator
ListIterator
```
for (ListIterator iter = list.listIterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element fr
Given a
List list object, I know of the following ways to loop through all elements:Basic for loop (of course, there're equivalent
while / do while loops as well)// Not recommended (see below)!
for (int i = 0; i < list.size(); i++) {
E element = list.get(i);
// 1 - can call methods of element
// 2 - can use 'i' to make index-based calls to methods of list
// ...
}Note: As @amarseillan pointed out, this form is a poor choice
for iterating over
Lists, because the actual implementation ofthe
get method may not be as efficient as when using an Iterator.For example,
LinkedList implementations must traverse all ofthe elements preceding i to get the i-th element.
In the above example there's no way for the
List implementation to"save its place" to make future iterations more efficient.
For an
ArrayList it doesn't really matter, because the complexity/cost of get is constant time (O(1)) whereas for a LinkedList is it proportional to the size of the list (O(n)). For more information about the computational complexity of the built-in
Collections implementations, check out this question.Enhanced for loop (nicely explained in this question)
for (E element : list) {
// 1 - can call methods of element
// ...
}Iterator
for (Iterator iter = list.iterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element from the list
// ...
}ListIterator
```
for (ListIterator iter = list.listIterator(); iter.hasNext(); ) {
E element = iter.next();
// 1 - can call methods of element
// 2 - can use iter.remove() to remove the current element fr
Solution
The three forms of looping are nearly identical. The enhanced
is, according to the Java Language Specification, identical in effect to the explicit use of an iterator with a traditional
In all cases,
Essentially, there are only two ways to iterate over a list: by using an index or by using an iterator. The enhanced for loop is just a syntactic shortcut introduced in Java 5 to avoid the tedium of explicitly defining an iterator. For both styles, you can come up with essentially trivial variations using
EDIT: As @iX3 points out in a comment, you can use a
for loop:for (E element : list) {
. . .
}is, according to the Java Language Specification, identical in effect to the explicit use of an iterator with a traditional
for loop. In the third case, you can only modify the list contents by removing the current element and, then, only if you do it through the remove method of the iterator itself. With index-based iteration, you are free to modify the list in any way. However, adding or removing elements that come before the current index risks having your loop skipping elements or processing the same element multiple times; you need to adjust the loop index properly when you make such changes.In all cases,
element is a reference to the actual list element. None of the iteration methods makes a copy of anything in the list. Changes to the internal state of element will always be seen in the internal state of the corresponding element on the list.Essentially, there are only two ways to iterate over a list: by using an index or by using an iterator. The enhanced for loop is just a syntactic shortcut introduced in Java 5 to avoid the tedium of explicitly defining an iterator. For both styles, you can come up with essentially trivial variations using
for, while or do while blocks, but they all boil down to the same thing (or, rather, two things).EDIT: As @iX3 points out in a comment, you can use a
ListIterator to set the current element of a list as you are iterating. You would need to use List#listIterator() instead of List#iterator() to initialize the loop variable (which, obviously, would have to be declared a ListIterator rather than an Iterator).Code Snippets
for (E element : list) {
. . .
}Context
Stack Overflow Q#18410035, score: 337
Revisions (0)
No revisions yet.