通常情况下,你会想要遍历集合中的元素。例如,你可能希望显示每个元素。最简单的方式是使用迭代器,即实现了 Iterator 或 ListIterator 接口的对象。
Iterator 允许你遍历集合,获取或移除元素。ListIterator 扩展了 Iterator 的功能,允许双向遍历列表以及修改元素。
在你可以通过迭代器访问集合之前,必须先获得一个迭代器。每一个集合类都提供了一个 iterator() 方法,返回一个指向集合起始位置的迭代器。通过这个迭代器对象,你可以一次一个地访问集合中的每个元素。
一般而言,要使用迭代器遍历集合的内容,请遵循以下步骤:
-
通过调用集合的
iterator() 方法获取到集合起始位置的迭代器。
-
设置一个循环,在其中调用
hasNext()。让循环在 hasNext() 返回 true 时继续执行。
-
在循环内部,通过调用
next() 获取每个元素。
对于实现了 List 的集合,也可以通过调用 ListIterator 获得迭代器。
Iterator 接口中声明的方法
1. boolean hasNext()
如果有更多的元素则返回 true,否则返回 false。
2. Object next()
返回下一个元素。如果没有下一个元素,则抛出 NoSuchElementException。
3. void remove()
移除当前元素。如果尝试调用未被 next() 调用所前置的 remove(),则会抛出 IllegalStateException。
ListIterator 接口中声明的方法
1. void add(Object obj)
将 obj 插入到列表中,在下一次调用 next() 时返回的元素前面。
2. boolean hasNext()
如果存在下一个元素则返回 true,否则返回 false。
3. boolean hasPrevious()
如果存在前一个元素则返回 true,否则返回 false。
4. Object next()
返回下一个元素。如果没有下一个元素,则抛出 NoSuchElementException。
5. int nextIndex()
返回下一个元素的索引。如果没有下一个元素,则返回列表的大小。
6. Object previous()
返回前一个元素。如果没有前一个元素,则抛出 NoSuchElementException。
7. int previousIndex()
返回前一个元素的索引。如果没有前一个元素,则返回 -1。
8. void remove()
从列表中移除当前元素。如果在调用 next() 或 previous() 之前调用了 remove(),则会抛出 IllegalStateException。
9. void set(Object obj)
将 obj 分配给当前元素。这是由上一次对 next() 或 previous() 的调用所返回的元素。
示例 1
以下是一个展示 Iterator 的例子。它使用了一个 ArrayList 对象,但是这些通用原则适用于任何类型的集合。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorDemo {
public static void main(String args[]) {
List<String> al = new ArrayList<>();
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
System.out.print("al 的原始内容: ");
Iterator<String> itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
System.out.println();
}
}
输出
al 的原始内容: C A E B D F
示例 2
以下是一个展示 ListIterator 的例子。它同样使用了一个 ArrayList 对象,但是这些通用原则适用于任何类型的集合。
当然,ListIterator 只能用于实现了 List 接口的集合。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class IteratorDemo {
public static void main(String args[]) {
List<String> al = new ArrayList<>();
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
System.out.print("al 的原始内容: ");
Iterator<String> itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
System.out.println();
}
}
输出
al 的原始内容: C A E B D F
示例 3
以下是一个展示在遍历过程中如何使用 ListIterator 修改列表的例子。它使用了一个 ArrayList 对象,但是这些通用原则适用于任何类型的集合。
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class IteratorDemo {
public static void main(String args[]) {
List<String> al = new ArrayList<>();
al.add("C");
al.add("A");
al.add("E");
al.add("B");
al.add("D");
al.add("F");
System.out.print("al 的原始内容: ");
Iterator<String> itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
System.out.println();
ListIterator<String> litr = al.listIterator();
while(litr.hasNext()) {
Object element = litr.next();
litr.set(element + "+");
}
System.out.print("修改后的 al 内容: ");
itr = al.iterator();
while(itr.hasNext()) {
Object element = itr.next();
System.out.print(element + " ");
}
System.out.println();
System.out.print("修改后的列表反向: ");
while(litr.hasPrevious()) {
Object element = litr.previous();
System.out.print(element + " ");
}
System.out.println();
}
}
输出
al 的原始内容: C A E B D F
修改后的 al 内容: C+ A+ E+ B+ D+ F+
修改后的列表反向: F+ D+ B+ E+ A+ C+