迭代器并发修改异常(ConcurrentModificationException)与列表迭代器(ListIterator)——每天一个Java小常识

喜欢就扣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);
		
	}
}

在这里插入图片描述

原创文章 57 获赞 381 访问量 20万+

猜你喜欢

转载自blog.csdn.net/xiaozhezhe0470/article/details/105881865