通常情况下,你会想要遍历集合中的元素。例如,你可能希望显示每个元素。最简单的方式是使用迭代器,即实现了 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+