详解 迭代器 —— Iterator接口、 ListIterator接口 与 并发修改异常
(请关注 本人“Collection集合”博文——《详解 Collection集合》)
Iterator接口(迭代器):
概述:
对 collection 进行迭代的迭代器
在我们现阶段的学习中,只需要理解这个接口所提供的三个方法即可:
- boolean hasNext()
如果仍有元素可以迭代,则返回 true。- E next()
返回迭代的下一个元素。- void remove()
从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。
现在,本人来通过一段代码来展示下迭代器的使用方法:
package com.youzg.about_iterator.core;
import java.util.*;
public class Test {
public static void main(String[] args) {
Collection arrayList = new ArrayList(); //由于ArrayList是Collection的实现类,所以我们可以这样去实例化一个Collection子类的对象
arrayList.add(1000);
arrayList.add(2000);
arrayList.add(3000);
arrayList.add(4000);
arrayList.add(5000);
arrayList.add(6000);
Iterator iterator = arrayList.iterator(); //我们必须通过这个方法得到迭代器,才能在之后通过迭代器遍历集合
System.out.println(iterator);
while (iterator.hasNext()) { //判断是否还有下一个元素
Object next = iterator.next(); //把指针狭义
System.out.println(next); //获取下一个元素
}
}
}
现在,本人来展示下运行结果:
下图是它的实现类和子接口:
Collection类有List类。
相应地,Iterator类也有ListIterator子类,
因为我们未来的编程对于List这个接口的使用比较频繁,所以,在这里,本人再来讲解一下有关ListIterator的知识点:
ListIterator接口:
- void add(E e)
将指定的元素插入列表(可选操作)。- boolean hasNext()
以正向遍历列表时,如果列表迭代器有多个元素,则返回 true(换句话说,如果 next 返回一个元素而不是抛出异常,则返回 true)。- boolean hasPrevious()
如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。 E next()
返回列表中的下一个元素。- int nextIndex()
返回对 next 的后续调用所返回元素的索引。- E previous()
返回列表中的前一个元素。- int previousIndex()
返回对 previous 的后续调用所返回元素的索引。- void remove()
从列表中移除由 next 或 previous 返回的最后一个元素(可选操作)。- void set(E e)
用指定元素替换 next 或 previous 返回的最后一个元素(可选操作)。
因为比 Iterator接口 多了一些方法,所以,我们可以对于一个List进行反向遍历
那么,现在,本人通过一段代码来展示下:
package edu.youzg.about_collection.core;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.ListIterator;
public class Test {
public static void main(String[] args) {
List arrayList = new ArrayList();
arrayList.add(1001);
arrayList.add(1002);
arrayList.add(1003);
arrayList.add(1004);
//正向迭代
ListIterator listIterator = arrayList.listIterator();
while (listIterator.hasNext()){
Object next = listIterator.next();
System.out.println(next);
}
System.out.println("===================");
//反向迭代:注意进行反向迭代器前,先进行正向迭代
// ListIterator listIterator2 = arrayList.listIterator();
while (listIterator.hasPrevious()){ //判断有没有上一个元素
Object previous = listIterator.previous(); //获取上一个元素
System.out.println(previous);
}
}
}
现在,本人来展示下运行结果:
讲到这里,相信同学们也差不多学会了该如何使用迭代器来遍历集合了,那么,现在本人来讲解一个非常常见的“异常”—— ConcurrentModificationException:
ConcurrentModificationException异常:
定义:
定义:
并发修改异常
出现原因:
出现原因:
我们的迭代依赖于集合, 当我们往集合中添加好了元素之后 获取迭代器 那么迭代器已经知道了集合的元素个数
这个时候你在遍历的时候又突然想给 集合里面增、删、改元素(用的是集合的add方法),就会与已生成的迭代器对于数量的记录产生冲突,就会报异常
解决方法:
解决方法:
用ListIterator迭代器遍历 用迭代器自带的add、remove、set方法添加元素 那就不会报错了
(Collection链接:https:////www.cnblogs.com/codderYouzg/p/12416566.html)
(集合总集篇链接:https://www.cnblogs.com/codderYouzg/p/12416560.html)