喜欢就扣1支持吧
我在之前的一个文章里介绍过迭代器Iterator,不了解迭代器的可以看下
名词解释
modCount :实际修改集合的次数
expectedModCount :预期修改集合的次数
ConcurrentModificationException:并发修改异常
异常发生条件
- 当实际修改集合的次数 不等于 预期修改集合的次数时,提示并发修改异常
- 迭代器遍历的过程中 ,通过集合对象修改了集合中元素的长度, 造成了迭代器获取元素中判断预期修改值和实际修改值不一致
解决方案
- 方案一:用for循环遍历, 然后用集合对象做对应的操作即可
- 方案二:使用列表迭代器(ListIterator)使用前提必须时List集合
列表迭代器(ListIterator)
- 通过List集合的listlterator()方法得到, 所以它是List集合特有的迭代器
- 用于允许程序员沿任一方向遍历列表的列表迭代器, 在迭代期间修改列表,并获取列表中迭代器的当前位置
Listlterator中的常用方法
方法 | 说明 |
---|---|
E next() | 返回迭代中的下一一个元素 |
boolean hasNext() | 如果迭代具有更多元素,则返回true |
E previous() | 返回列表中的上一个元素 |
boolean hasPrevious() | 如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true |
void add(E e) | 将指定的元素插入列表 |
Listlterator与Iterator代码样例
import java.util.*;
public class Dmeo {
public static void main(String[] args) {
//创建集合对象
List<String> list = new ArrayList<String>();
//添加元素
list.add("hello");
list.add("world");
//并发修改异常,创建Iterator迭代器对象
// Iterator<String> iterator = list.iterator();
// while (iterator.hasNext()) {
// String x = iterator.next();
// if(x.equals("world")) {
// list.add("javaee");
// }
// }
//方法一
//for循环方式解决
for(int i=0; i<list.size(); i++) {
String s = list.get(i);
if(s.equals("world")) {
list.add("java");
}
}
//方法二
//通过list集合的listIterator ()方法得到ListIterator列表迭代器对象
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
String x = listIterator.next();
if(x.equals("world")) {
//注意,这里使用listIterator列表迭代器对象的add方法添加
listIterator.add("java");
}
}
System.out.println(list);
}
}