`
iwindyforest
  • 浏览: 235190 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

解决用foreach循环遍历集合时remove抛出ConcurrentModificationException异常

 
阅读更多
List<String> list = new ArrayList<String>();  
//使用foreach循环会抛出ConcurrentModificationException异常  
for(String s : list) {  
    if(name.equals(s) {  
        list.remove(s);  
    }  
}  

 

因为foreach使用Iterator来遍历元素的, 每次元素开始遍历之前都会检查集合中的数据是否一致, 如果不一致则抛

ConcurrentModificationException

异常. 参考Arraylist的实现:

 

if (modCount != expectedModCount) {
            throw new ConcurrentModificationException();
}

 

最好的解决方法是使用CopyOnWriteArrayList, CopyOnWriteArraySet实现,

List<String> list = new CopyOnWriteArrayList<String>();
list.add("Alpha");
list.add("Beta");
list.add("Cat");
list.add("Dog");		
for (String s : list) {
	if (!"".equals(s)) {					
		list.remove(s);
	}
}
 

分享到:
评论

相关推荐

    java 使用foreach遍历集合元素的实例

    5. **异常解释**:`ConcurrentModificationException`通常在多线程环境下对共享集合进行并发修改时抛出,但在单线程环境中,当使用`foreach`循环并尝试在循环内部修改集合时,也会抛出此异常。这是因为`foreach`循环...

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

    然而,在使用`forEach`循环时,直接尝试修改遍历的集合(例如删除或添加元素)是不被允许的,因为这会导致`ConcurrentModificationException`异常。本文将探讨在使用`forEach`循环中遇到无法删除元素的问题,并提供...

    java中循环遍历删除List和Set集合中元素的方法(推荐)

    在Java编程中,遍历并删除集合(如List或Set)中的元素是一项常见的操作,但如果不正确地执行,可能会...在遍历集合时,始终优先考虑使用Iterator或Java 8以上的特性,以避免`ConcurrentModificationException`异常。

    java-集合-知识点汇总

    * fail-fast与fail-safe:Java集合在遍历时可能会抛出ConcurrentModificationException异常,这是因为集合在遍历时可能会被修改。fail-fast机制将抛出异常,而fail-safe机制将忽略修改。 * transient关键字:在...

    Java中List集合的遍历实例详解

    此外,foreach循环不能在遍历过程中修改集合,否则会抛出`ConcurrentModificationException`异常。 3. **索引遍历** 最传统的方式是通过索引来遍历List集合,这种方式适用于需要访问元素索引的情况: ```java ...

    java灵魂13问.pdf

    6. foreach循环中禁止remove/add操作:在使用foreach循环遍历集合时,进行remove或add操作可能会导致 ConcurrentModificationException异常,因为foreach循环依赖于集合的快速失败行为,任何结构性修改都可能破坏...

    【Java面试题】List如何一边遍历,一边删除?

    - 在遍历集合并修改集合内容时,应避免使用增强型for循环,因为它会抛出`ConcurrentModificationException`。 - 使用Iterator的`remove()`方法是安全的,因为它能同步迭代器和集合的状态。 - 对于使用for循环的...

    Java list利用遍历进行删除操作3种方法解析

    这个示例中,会抛出 ConcurrentModificationException 异常,因为在遍历 list 时,不能修改 list 的内容。为了解决这个问题,可以使用 CopyOnWriteArrayList,避免这种异常: ```java CopyOnWriteArrayList&lt;String&gt;...

    java集合迭代器Iterator中的remove陷阱

    5. **遍历安全**:为了避免并发修改异常,可以考虑使用`Iterator`的增强型for循环(foreach)来遍历集合,这样在遍历时删除元素会更安全,因为编译器会自动处理迭代器的同步问题。 ```java for (String element : ...

    集合框架以及泛型的相关应用

    这是因为在迭代器内部有一个状态,记录了集合的预期状态,当集合被其他方式修改时,这个状态就会不匹配,从而抛出异常。 7. **集合操作**:通过示例代码可以看到,`ArrayList`的`add()`方法用于添加元素,`remove()...

    java中for循环删除集合陷阱

    在这种情况下,Java会自动处理迭代器,不允许在循环内部进行集合的增删改操作,否则会抛出`ConcurrentModificationException`异常。 然而,在常规for循环中,开发者可能会尝试手动遍历集合并删除元素,如以下代码所...

    Java开发规约.rar

    - 尽量使用`foreach`循环遍历集合,避免索引操作。 - 避免使用`Collection.remove()`操作,因其可能抛出`ConcurrentModificationException`,推荐使用`Iterator.remove()`。 - 对于可能会为空的集合,操作前应...

    java基础 集合-22-迭代器设计模式

    在多线程环境中,如果不正确地使用迭代器,可能会出现并发修改异常(`ConcurrentModificationException`)。为了解决这个问题,Java提供了`ConcurrentSkipListMap`和`CopyOnWriteArrayList`等线程安全的集合,它们的...

    《Java开发手册(泰山版)》灵魂13问.pdf

    但如果操作不当,例如在遍历ArrayList时直接使用subList方法返回的子列表进行remove操作,可能会导致ConcurrentModificationException异常,因为subList返回的子列表是一个视图,没有自己的迭代器。 5. 避免for循环...

    Iterator详解

    在多线程环境下,需要注意的是,如果一个线程正在使用迭代器遍历集合,另一个线程同时修改了集合,可能会导致`ConcurrentModificationException`。为了避免这种情况,可以使用`Collections.synchronizedList()`或`...

    阿里开发规范(集合与并发处理)

    **强制规定**:通过 `Arrays.asList()` 方法将数组转换为集合时,不应使用集合的修改方法(如 `add`, `remove`, `clear`),因为这些方法会抛出 `UnsupportedOperationException` 异常。 **说明**:`Arrays.asList`...

    Java Collections集合继承结构_动力节点Java学院整理

    在使用`Iterator`或`ListIterator`遍历集合时,需要注意不要在迭代过程中直接修改集合,否则可能会抛出`ConcurrentModificationException`异常。 此外,Java集合框架还包括`Map`接口,它用于存储键值对。`Map`接口...

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

    - **注意**:必须使用Iterator的`remove()`方法删除元素,而不是直接调用List的`remove()`方法,否则依然会抛出`ConcurrentModificationException`。 总结,遍历删除List元素时,推荐使用Iterator,因为它提供了...

Global site tag (gtag.js) - Google Analytics