Iterator和ListIterator:集合的遍历和修改
发布时间: 2023-12-14 20:45:45 阅读量: 37 订阅数: 35
# 1. 简介
### 1.1 Iterator和ListIterator的定义
Iterator和ListIterator是Java集合框架中用于遍历集合元素的接口。它们都实现了`Iterator`接口,但是ListIterator是Iterator的子接口,提供了更多的遍历和修改集合的操作。
### 1.2 Iterator和ListIterator的区别
- Iterator只能用于遍历集合,而ListIterator则可以遍历和修改集合。
- Iterator只能由集合的开头向后遍历,而ListIterator可以在集合的任意位置进行双向遍历。
- ListIterator还提供了获取当前迭代器指向位置的前一个元素和后一个元素的方法。
下面将分别介绍Iterator和ListIterator的使用方法和场景。
# 2. Iterator的使用
Iterator是集合框架提供的用于遍历集合元素的接口,可以用于遍历任何实现了Iterable接口的集合类。Iterator提供了一系列基本操作和方法,方便我们对集合进行遍历、访问和删除操作。接下来我们将介绍Iterator的基本使用方法和常见问题。
#### 2.1 Iterator的基本操作
Iterator接口定义了以下几个基本操作:
- `hasNext()`:判断是否还有下一个元素。
- `next()`:返回集合中的下一个元素。
- `remove()`:从集合中删除当前迭代器指向的元素。
下面是一个使用Iterator遍历ArrayList的示例:
```java
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorExample {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
int num = iterator.next();
System.out.println(num);
}
}
}
```
运行上述代码,我们可以得到以下输出:
```
1
2
3
```
#### 2.2 Iterator的遍历集合
Iterator可以用于遍历任何实现了Iterable接口的集合类,常见的如ArrayList、LinkedList、HashSet等。通过调用集合的`iterator()`方法即可获取对应的Iterator对象。
```java
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorExample {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
int num = iterator.next();
System.out.println(num);
}
}
}
```
上述代码演示了如何使用Iterator遍历ArrayList集合,并打印出每个元素的值。
#### 2.3 Iterator的迭代器失效问题
在使用Iterator遍历集合时,需要注意可能会发生迭代器失效的情况。当我们在使用Iterator过程中,对集合进行了增删操作,都有可能导致迭代器失效。一旦迭代器失效,再使用迭代器的相关方法就会抛出`ConcurrentModificationException`异常。
下面的示例演示了迭代器失效的情况:
```java
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorExample {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
int num = iterator.next();
System.out.println(num);
list.remove(num); // 删除元素,导致迭代器失效
}
}
}
```
运行上述代码会抛出`ConcurrentModificationException`异常。
为了避免迭代器失效,我们可以使用Iterator的`remove()`方法来删除元素,该方法会更新迭代器的状态,避免迭代器失效。
```java
import java.util.ArrayList;
import java.util.Iterator;
public class IteratorExample {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
int num = iterator.next();
System.out.println(num);
iterator.remove(); // 使用remove()方法删除元素,迭代器不会失效
}
}
}
```
运行上述代码,我们可以得到以下输出:
```
1
2
3
```
在使用Iterator遍历集合时,务必要注意是否会对集合进行增删操作,以避免迭代器失效的问题。
这就是Iterator的基本使用方法和常见问题,接下来我们将介绍ListIterator的使用方法和区别。
# 3. ListIterator的使用
ListIterator是Iterator的子接口,它继承了Iterator的基本操作,并提供了更丰富的功能。与Iterator只能从前往后遍历集合不同,ListIterator可以实现双向遍历,并支持修改集合的操作。
#### 3.1 ListIterator的基本操作
ListIterator的基本操作包括:向前遍历、向后遍历、获取当前元素、修改当前元素、插入新元素和删除元素等。
```java
import java.util.ArrayList;
import java.util.ListIterator;
public class ListIteratorExample {
public static void main(String[] args) {
ArrayList<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("banana");
fruits.add("orange");
ListIterator<String> iterator = fruits.listIterator();
// 向前遍历
while (iterator.hasNext()) {
String fruit = iterator.next();
System.out.println(fruit);
}
// 向后遍历
while (iterator.hasPrevious()) {
String fruit = iter
```
0
0