在 Java 中,迭代器是一个设计模式,用于遍历集合中的元素。Java 提供了 Iterator 接口来实现这一功能。迭代器的主要作用是提供一种通用的遍历集合的方法,而不需要了解集合的具体实现细节。
remove方法安全地移除元素,而不会引发并发修改异常。Iterator 只能单向遍历集合,不能反向遍历。remove方法删除元素,不能添加或修改元素。如果需要更复杂的修改操作,需要使用其他工具或方法。
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// 获取迭代器
Iterator<String> iterator = list.iterator();
// 判断当前位置是否有元素
while(iterator.hasNext()) {
// 获取当前元素的值并且将迭代器移入下一个对象
String next = iterator.next();
System.out.println(next);
}
看如下代码:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// 获取迭代器
Iterator<String> iterator = list.iterator();
// 判断当前位置是否有元素
while(iterator.hasNext()) {
// 获取当前元素的值并且将迭代器移入下一个对象
String next = iterator.next();
System.out.println(next);
}
// 再次获取一次元素
iterator.next();
iterator.hasNext()判断当前位置没有元素,while循环以及结束后,此时如果再次调用iterator.next()获取当前元素,会报出NoSuchElementException:没有当前元素异常。
重新获取迭代器对象。NoSuchElementException异常集合的增加或者删除的方法。注意事项中说到:迭代器遍历的时候不能使用集合的增加或者删除的方法,那迭代器不就成打印的了?那要他有啥用,别急,迭代器提供了一个删除的方法:remove( ),它能移除集合中由迭代器返回的最后一个元素。
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// 获取迭代器
Iterator<String> iterator = list.iterator();
// 判断当前位置是否有元素
while(iterator.hasNext()) {
// 获取当前元素的值并且将迭代器移入下一个对象
String next = iterator.next();
if(next.startsWith("a")) {
iterator.remove();
}
}
System.out.println(list);//[b, c]
以防有人不知道增强for循环,这里先给出一个例子:
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
for (String s : list) {
System.out.println(s);
}
为什么这里要讲增强for循环?因为增强for循环的底层就是迭代器iterator,同理,他有如下特点:
ConcurrentModificationException 异常。ListIterator 是 Java 提供的一个专门用于列表的数据结构(如 ArrayList、LinkedList)的迭代器接口,它是 Iterator 接口的子接口。与Iterator相比,ListIterator 提供了更丰富的遍历和操作列表的功能,包括双向遍历、添加元素、替换元素等。
| 方法签名 | 返回类型 | 说明 |
|---|---|---|
boolean hasNext() | boolean | 如果迭代器后面还有元素,返回 true。 |
E next() | E | 返回迭代器的下一个元素。 |
boolean hasPrevious() | boolean | 如果迭代器前面还有元素,返回 true。 |
E previous() | E | 返回迭代器的前一个元素。 |
int nextIndex() | int | 返回迭代器的下一个元素的索引。 |
int previousIndex() | int | 返回迭代器的前一个元素的索引。 |
void remove() | void | 移除迭代器返回的最后一个元素。 |
void set(E e) | void | 用指定的元素替换迭代器返回的最后一个元素。 |
void add(E e) | void | 在列表中插入指定的元素。 |
对于上述方法,我们只需要了解到add(),set()即可
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// 获取迭代器
ListIterator<String> iterator = list.listIterator();
// 判断当前位置是否有元素
while (iterator.hasNext()) {
if("a".equals(iterator.next())){
iterator.add("a1");
}
}
System.out.println(list);//[a, a1, b, c]
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
// 获取迭代器
ListIterator<String> iterator = list.listIterator();
// 判断当前位置是否有元素
while (iterator.hasNext()) {
if("a".equals(iterator.next())){
iterator.set("a1");
}
}
System.out.println(list);//[a1, b, c]