Java集合框架——并发修改异常出现的原因

并发修改异常出现的原因

案例实操:查找集合中是否有helloworld元素,有的话就插入hellojava元素

一、初始代码(错误)

package com.list.demo2;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListTest2 {
	@SuppressWarnings("all")
	public static void main(String[] args) {
		List list = new ArrayList();
		
		list.add("aaa1");
		list.add("aaa2");
		list.add("aaa3");
		list.add("helloworld");
		list.add("aaa3");
		list.add("aaa4");
		
		Iterator iterator = list.iterator();
		while(iterator.hasNext()) {
			Object next = iterator.next();
			String str = (String)next;
			if(str.equals("helloworld")) {
				list.add("hellojava");
			}
		}
		
		System.out.println(list);
	}
}
  • 报错:java.util.ConcurrentModificationException (并发修改异常)
  • 分析:首先获得了List集合的迭代器,迭代器是依赖集合而存在的,也是根据集合而创建的,但是在遍历集合的过程中,对集合进行了修改,修改之后迭代器并不知晓,却依旧使用原来的迭代器遍历集合,这时候就会出错

二、解决方法

  • 方法一
  • 用集合自身的方法进行遍历,再用集合自身的方法进行添加(get、set)
	for (int i = 0; i < list.size(); i++) {
		Object next = list.get(i);
		String str = (String)next;
		if(str.equals("helloworld")) {
			list.add("hellojava");
			break;
	}
	System.out.println(list);
	//在列表的末尾添加hellojava
	// [aaa1, aaa2, aaa3, helloworld, aaa3, aaa4, hellojava]
  • 方法二
  • 用集合迭代器ListIterator进行迭代,再用集合迭代器进行添加(add)
	ListIterator listIterator = list.listIterator();
	while(listIterator.hasNext()) {
		Object next = listIterator.next();
		String str = (String)next;
		if(str.equals("helloworld")) {
			listIterator.add("hellojava");
			break;
		}
	}
	System.out.println(list);
	//在当前找到的元素后面添加hellojava
	// [aaa1, aaa2, aaa3, helloworld, hellojava, aaa3, aaa4]

三、完整代码(正确)

package com.list.demo2;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class ListTest2 {
	@SuppressWarnings("all")
	public static void main(String[] args) {
		List list = new ArrayList();
		
		list.add("aaa1");
		list.add("aaa2");
		list.add("aaa3");
		list.add("helloworld");
		list.add("aaa3");
		list.add("aaa4");
		
		//错误代码
//		Iterator iterator = list.iterator();
//		while(iterator.hasNext()) {
//			Object next = iterator.next();
//			String str = (String)next;
//			if(str.equals("helloworld")) {
//				list.add("hellojava");
//			}
//		}
		
		//方法一:用集合自身的方法进行遍历,再用集合自身的方法进行添加
//		for (int i = 0; i < list.size(); i++) {
//			Object next = list.get(i);
//			String str = (String)next;
//			if(str.equals("helloworld")) {
//				list.add("hellojava");
//				break;
//		}
		
		//方法二:用集合迭代器ListIterator进行迭代,再用集合迭代器进行添加
		ListIterator listIterator = list.listIterator();
		while(listIterator.hasNext()) {
			Object next = listIterator.next();
			String str = (String)next;
			if(str.equals("helloworld")) {
				listIterator.add("hellojava");
				break;
			}
		}
			
		System.out.println(list);
	}
}

你可能感兴趣的:(#,Java集合框架)