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
相关推荐
解决这个问题的方法有几种: 1. 使用`Iterator`的`remove()`方法:这是安全的,因为它会在删除当前迭代对象的同时更新索引,避免了异常的发生。例如: ```java Iterator, Integer>> iter = map.entrySet()....
解决方法是将其作为 ArrayList 构造方法的参数重新 new 出一个 List,或者使用 Guava 库中的 Lists.newArrayList 方法将返回的新 List 和原始数组解耦。 第三个坑:直接遍历 List 集合删除元素会报错 在直接遍历 ...
- **迭代器(Iterator)**:`Iterator`是Java集合框架的一部分,它提供了一种安全的方式来遍历集合,可以方便地进行添加、删除操作,且不会抛出`ConcurrentModificationException`。示例代码中的`it.hasNext()`和`...
List接口继承自Collection接口,并增加了几个额外的方法来支持有序性和索引操作。List中的元素可以通过索引来访问。 ##### 1.3.2 常用方法 - `get(int index)`:返回指定位置的元素。 - `set(int index, E element...
这里我们将详细讨论几种不同的循环遍历和删除元素的方法,以及它们的适用场景。 1. **常规for循环**: ```java for (int i = 0; i < list.size(); i++) { if (list.get(i).equals("del")) { list.remove(i); }...
本文将探讨在使用`forEach`循环中遇到无法删除元素的问题,并提供几种解决方案。 首先,了解为什么在`forEach`循环中不能直接修改集合是很重要的。Java集合框架中的`forEach`循环是基于迭代器的`hasNext()`和`next...
以下是几种常见的遍历删除List元素的方法及其注意事项: 1. **通过增强的for循环删除元素** - **问题**:在增强的for循环(foreach)中直接删除元素会导致`ConcurrentModificationException`,因为这种方式不允许...
根据提供的文件信息,我们可以归纳和展开以下几个核心知识点: ### 1. List集合概述与特点 #### 1.1 List集合概述 - **定义**: `List`是Java集合框架中的一个接口,代表一种有序集合(也被称为序列)。它允许用户...
在Java中,有几种不同的遍历方式: 1. **使用索引下标遍历**: 当使用索引下标遍历List并尝试删除元素时,可能会遇到遗漏元素的情况。如以下示例所示: ```java for (int i = 0; i < list.size(); i++) { if (2...
本篇将详细介绍几种常见的容器类(如LinkedList、Vector、ArrayList和Hashtable)以及它们的迭代器用法。 1. **LinkedList**: LinkedList是一种双向链表,它允许在列表的任何位置插入和删除元素。由于其结构,...
1. **减少编码工作量**:`AbstractList`实现了`List`接口的所有方法,除了少数几个必须由子类实现的方法。这意味着开发者只需要关注那些特定于自己需求的方法实现即可。 2. **提供默认实现**:`AbstractList`提供了...
这些接口包括List、Set、Queue等,它们各自代表了一种特定的数据结构。而类如ArrayList、LinkedList、HashSet、HashMap等则是这些接口的具体实现,用于满足不同场景的需求。 在讲解“集合框架(List集合具体对象的...
主要有以下几种类型: - `ArrayList`:基于数组的实现,支持随机访问元素。 - `LinkedList`:基于双向链表的实现,适合频繁添加和删除元素的操作。 - `Vector`:线程安全的`ArrayList`,但性能较低,不推荐使用。...
在Java中,Set和List的迭代器实现步骤主要包括以下几个步骤: 1. 创建迭代器对象:在使用迭代器之前,需要创建一个迭代器对象。例如,在ArrayList中,可以使用Iterator接口来创建一个迭代器对象。 2. 检查是否还有...
这两种方法都允许我们访问ArrayList中的每个元素,但它们的实现方式略有不同。 ### 1. 使用Iterator接口迭代 Iterator接口是Java集合框架的一部分,提供了一种安全的方式来遍历任何集合,包括ArrayList。使用...
在Java SE的课程中,集合框架的讲解通常会涵盖以下几个主要部分: 1. **Java集合框架**:Java集合框架是一个用于存储和操作对象的统一架构,包括了多种数据结构,如列表(List)、集合(Set)和映射(Map)。这个...
7. **Java集合框架中的重要类和方法**:包括但不限于Collection、Set、List、Map、Iterator、EnumSet、EnumMap、SortedSet、NavigableSet、SortedMap、NavigableMap以及它们的实现类。 在Java集合框架的发展史上,...
`Iterator`接口是用于遍历集合的一种方式,它提供了以下几种方法: - `boolean hasNext()`:检查是否还有更多的元素可以遍历。 - `Object next()`:返回下一个元素,如果没有更多元素,则抛出`...