`

解决List的ConcurrentModificationException的几种方法

阅读更多

 

 

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class Test {

	public static void main(String[] args) {
		String codes = "HH|140402001>RQSPF=1+SPF=3,140402002>RQSPF=3+SPF=1|2*1";
		Pattern p = Pattern.compile("(\\d{9})");
        Matcher m = p.matcher(codes);
		Map<String, String> rqMap = new HashMap<String, String>();
		List<String> itemList = new ArrayList<String>();
		
		CopyOnWriteArrayList<String> currList = new CopyOnWriteArrayList<String>(itemList);
    //    List<String> currList = Collections.synchronizedList(itemList);     //报ConcurrentModificationException异常
		
		
        while (m.find()) {
    //    	System.out.println(m.group());
        	itemList.add(matcher.group());
        }
		
		
				
		for (String yhItem : currList) {	//正确
			String totalItem = xml.getStringValue("row[" + i + "].@close");
			if (yhItem.equals(mid)) {
				rqMap.put(yhItem, totalItem);
				currList.remove(yhItem);
			}
		}
			
//			for (int j=0; j<itemList.size(); j++) {   //正确	//或者使用 list.iterator 的remove() 或者使用CopyOnWriteArrayList,使用其它的方式可能会报ConcurrentModificationException异常
//				String totalItem = xml.getStringValue("row[" + i + "].@close");
//				String yhItem = itemList.get(j);
//				if (yhItem.equals(mid)) {
//					rqMap.put(yhItem, totalItem);
//					itemList.remove(j);
//				}
//			}
		
		
//        Iterator<String> iterator = itemList.iterator();    	//正确
//        while (iterator.hasNext()) { 
//		    String totalItem = xml.getStringValue("row[" + i + "].@close");
//            String yhItem = iterator.next();  
//			if (yhItem.equals(mid)) {
//				rqMap.put(yhItem, totalItem);
//				iterator.remove();
//			}
//        }   
				
		
//			for (String yhItem : itemList) {		//报ConcurrentModificationException异常
//				String totalItem = xml.getStringValue("row[" + i + "].@close");
//				if (yhItem.equals(mid)) {
//					rqMap.put(yhItem, totalItem);
//					int k = itemList.indexOf(yhItem);
//					itemList.remove(k);
//				}
//			}

	}

}

 

 

 详细源代码分析及原理摘自其它的博客:

http://arron-li.iteye.com/blog/645008

http://blog.csdn.net/aa4790139/article/details/6438869

http://www.cnblogs.com/yanghuahui/p/3365509.html

 

 

分享到:
评论

相关推荐

    java 集合并发操作出现的异常ConcurrentModificationException

    解决这个问题的方法有几种: 1. 使用`Iterator`的`remove()`方法:这是安全的,因为它会在删除当前迭代对象的同时更新索引,避免了异常的发生。例如: ```java Iterator, Integer&gt;&gt; iter = map.entrySet()....

    详解Java 集合类 List 的那些坑

    解决方法是将其作为 ArrayList 构造方法的参数重新 new 出一个 List,或者使用 Guava 库中的 Lists.newArrayList 方法将返回的新 List 和原始数组解耦。 第三个坑:直接遍历 List 集合删除元素会报错 在直接遍历 ...

    java中List的用法.pdf

    - **迭代器(Iterator)**:`Iterator`是Java集合框架的一部分,它提供了一种安全的方式来遍历集合,可以方便地进行添加、删除操作,且不会抛出`ConcurrentModificationException`。示例代码中的`it.hasNext()`和`...

    Java集合Collection、List、Set、Map使用详解

    List接口继承自Collection接口,并增加了几个额外的方法来支持有序性和索引操作。List中的元素可以通过索引来访问。 ##### 1.3.2 常用方法 - `get(int index)`:返回指定位置的元素。 - `set(int index, E element...

    java中循环删除list中元素的方法总结

    这里我们将详细讨论几种不同的循环遍历和删除元素的方法,以及它们的适用场景。 1. **常规for循环**: ```java for (int i = 0; i &lt; list.size(); i++) { if (list.get(i).equals("del")) { list.remove(i); }...

    forEach中为什么不能删除元素解决方案.pdf

    本文将探讨在使用`forEach`循环中遇到无法删除元素的问题,并提供几种解决方案。 首先,了解为什么在`forEach`循环中不能直接修改集合是很重要的。Java集合框架中的`forEach`循环是基于迭代器的`hasNext()`和`next...

    正确遍历删除List中的元素方法(推荐)

    以下是几种常见的遍历删除List元素的方法及其注意事项: 1. **通过增强的for循环删除元素** - **问题**:在增强的for循环(foreach)中直接删除元素会导致`ConcurrentModificationException`,因为这种方式不允许...

    day04集合.pdf

    根据提供的文件信息,我们可以归纳和展开以下几个核心知识点: ### 1. List集合概述与特点 #### 1.1 List集合概述 - **定义**: `List`是Java集合框架中的一个接口,代表一种有序集合(也被称为序列)。它允许用户...

    Java如何在List或Map遍历过程中删除元素

    在Java中,有几种不同的遍历方式: 1. **使用索引下标遍历**: 当使用索引下标遍历List并尝试删除元素时,可能会遇到遗漏元素的情况。如以下示例所示: ```java for (int i = 0; i &lt; list.size(); i++) { if (2...

    各容器与迭代器的用法.docx

    本篇将详细介绍几种常见的容器类(如LinkedList、Vector、ArrayList和Hashtable)以及它们的迭代器用法。 1. **LinkedList**: LinkedList是一种双向链表,它允许在列表的任何位置插入和删除元素。由于其结构,...

    JAVA初学教程教你学会JAVA4

    1. **减少编码工作量**:`AbstractList`实现了`List`接口的所有方法,除了少数几个必须由子类实现的方法。这意味着开发者只需要关注那些特定于自己需求的方法实现即可。 2. **提供默认实现**:`AbstractList`提供了...

    毕向东1402

    这些接口包括List、Set、Queue等,它们各自代表了一种特定的数据结构。而类如ArrayList、LinkedList、HashSet、HashMap等则是这些接口的具体实现,用于满足不同场景的需求。 在讲解“集合框架(List集合具体对象的...

    java 面试题目

    主要有以下几种类型: - `ArrayList`:基于数组的实现,支持随机访问元素。 - `LinkedList`:基于双向链表的实现,适合频繁添加和删除元素的操作。 - `Vector`:线程安全的`ArrayList`,但性能较低,不推荐使用。...

    Java中Set&List的迭代器实现步骤解析

    在Java中,Set和List的迭代器实现步骤主要包括以下几个步骤: 1. 创建迭代器对象:在使用迭代器之前,需要创建一个迭代器对象。例如,在ArrayList中,可以使用Iterator接口来创建一个迭代器对象。 2. 检查是否还有...

    java 中ArrayList迭代的两种实现方法

    这两种方法都允许我们访问ArrayList中的每个元素,但它们的实现方式略有不同。 ### 1. 使用Iterator接口迭代 Iterator接口是Java集合框架的一部分,提供了一种安全的方式来遍历任何集合,包括ArrayList。使用...

    Java SE完整版精品优质课件 自学入门必看的优秀Java基础知识培训教案 第07章_Java集合(共51页).pptx

    在Java SE的课程中,集合框架的讲解通常会涵盖以下几个主要部分: 1. **Java集合框架**:Java集合框架是一个用于存储和操作对象的统一架构,包括了多种数据结构,如列表(List)、集合(Set)和映射(Map)。这个...

    java集合框架全面进阶.pdf

    7. **Java集合框架中的重要类和方法**:包括但不限于Collection、Set、List、Map、Iterator、EnumSet、EnumMap、SortedSet、NavigableSet、SortedMap、NavigableMap以及它们的实现类。 在Java集合框架的发展史上,...

    详解java集合框架

    `Iterator`接口是用于遍历集合的一种方式,它提供了以下几种方法: - `boolean hasNext()`:检查是否还有更多的元素可以遍历。 - `Object next()`:返回下一个元素,如果没有更多元素,则抛出`...

Global site tag (gtag.js) - Google Analytics