关于java List的remove方法导致的异常java.util.ConcurrentModificationException
今天在项目遇到客户的一个要求,在添加联系人组的时候需要删除sim卡选项.我这边想到方法就是去掉拿到list 之后再for 循环中去掉sim相关项
便写了下面的方法,
private void removeAccouts(List<AccountWithDataSet> accouts) { for (int i = 0; i < accouts.size(); i++) { AccountWithDataSet accountWithDataSet = accouts.get(i); Log.d(TAG,"selectAccountAndCreateGroup " + accountWithDataSet.name + "--" + accountWithDataSet.type); if(accountWithDataSet.name.contains("SIM")){ accouts.remove(accountWithDataSet); } } Log.d(TAG,"removeAccouts accouts=" + accouts ); }
但是实际运行的时候报出异常java.util.ConcurrentModificationException
后来就准备把要删除的item 保存到一个新的list 里面再去删除,但是奇怪的是虽然list.remove(object o) 方法执行返回了success,但是实际确没有删除,最后网上查了一下具体的解决方法
原因:List每remove掉一个元素以后,后面的元素都会向前移动,此时如果执行i=i+1,则刚刚移过来的元素没有被读取
1.倒过来遍历list
for (int i = list.size()-1; i > =0; i--) { if (((String) list.get(i)).startsWith("abcde")) { list.remove(i); } }
2.每移除一个元素以后再把i移回来
for (int i = 0; i < list.size(); i++) { if (((String) list.get(i)).startsWith("abcde")) { list.remove(i); i=i-1; } }
3.使用iterator.remove()方法删除
for (Iterator it = list.iterator(); it.hasNext();) { String str = (String)it.next(); if (str.equals("chengang")){ it.remove(); } }
以上方法参考:http://blog.sina.com.cn/s/blog_621b6f0e0100s5n5.html
相关推荐
Java.util.ConcurrentModificationException 异常问题详解 ConcurrentModificationException 异常是 Java 中一个常见的异常,它发生在 Iterator 遍历集合时,集合同时被修改引起的异常。在 Java 中,集合类如 ...
在Java编程中,`ConcurrentModificationException`是一个常见的运行时异常,主要出现在多线程环境下对集合类(如List、Set、Map等)进行并发修改时。然而,这个异常不仅限于多线程环境,即使在单线程中,如果在遍历...
但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除元素),Iterator将抛出ConcurrentModificationException异常。 Set接口是Collection接口的子接口...
可以使用`Iterator`或`List.removeIf()`等方法。 3. **线程安全**:对多线程环境下的代码要特别注意,避免数据竞争和死锁,合理使用`synchronized`关键字或`java.util.concurrent`包中的工具类。 三、设计模式 1. ...
在Java编程语言中,集合框架(`java.util`包)提供了多种容器类来存储对象,如`List`、`Set`和`Map`等。为了遍历这些容器中的元素,Java引入了迭代器模式(Iterator Pattern),这是一种常用的设计模式,它提供了一...
详解 Java 集合类 List ...List 并不是我们常用的 java.util.ArrayList,而是 Arrays 的静态内部类 java.util.Arrays.ArrayList,该类继承自抽象类 java.util.AbstractList,但没有实现 add 方法,默认抛出 java.lang_...
4. **示例代码:MyIterator.java** 我们可以创建一个简单的程序,演示如何使用`Iterator`遍历ArrayList: ```java import java.util.ArrayList; import java.util.Iterator; public class MyIterator { ...
正确做法是使用迭代器,但使用增强for循环(for-each)配合`list.remove()`会抛出`ConcurrentModificationException`。正确的迭代器移除方式如下: ```java Iterator<String> iter = list.iterator(); while ...
import java.util.List; import java.util.Arrays; public class EnhancedForLoopExample { public static void main(String[] args) { List<String> names = Arrays.asList("Ada Lovelace", "Alan Turing", ...
迭代器接口定义在java.util包中,它提供了三个主要的方法:`hasNext()`、`next()`和`remove()`。`hasNext()`用于检查集合中是否还有更多元素,`next()`返回下一个元素,而`remove()`则删除当前元素。下面是一个使用...
ArrayList是Java中`java.util`包下的一个类,它是List接口的一个具体实现。ArrayList基于动态数组,允许我们在列表的任何位置插入和删除元素,提供了快速访问元素的能力。其内部实现通过扩容机制来保证在添加元素时...
在`for-each`循环中删除元素会引发`ConcurrentModificationException`,因为编译器自动调用`.next()`在`.remove()`之后,而迭代器要求`.next()`在`.remove()`之前调用。 4. **Hashtable与HashMap的区别**: 这...
它允许双向遍历List,并且可以使用add()、remove()和set()方法来修改列表。与Iterator只能向前遍历不同,ListIterator提供了hasPrevious()和previous()方法,允许逆向遍历。同时,ListIterator可以知道它的当前索引...
当迭代器检测到列表在迭代过程中发生了改变时,它会抛出`ConcurrentModificationException`异常,以避免潜在的数据不一致性问题。 这种机制通过维护一个名为`modCount`的域来实现,每次列表发生结构性变化时(如...
此外,如果在迭代期间直接修改集合(如使用`add()`、`remove()`等方法,而不是通过迭代器),可能会导致`ConcurrentModificationException`,因为这破坏了迭代器的内部状态。 总结来说,Java的LinkedList与内置迭代...
在Java编程中,遍历并删除List集合是一个常见的操作,但在实际编程中,如果不使用正确的方法,可能会导致`java.util.ConcurrentModificationException`异常。本文主要针对这个面试题,详细讲解如何在遍历List的同时...
在Java中,集合类位于`java.util`包内,它们为程序员提供了一种灵活的方式来存储和操作对象。 1. **集合概述**: - 集合是一个容器,可以容纳一组对象,每个对象作为一个元素存在。 - 与数组相比,集合具有动态...
为了避免这种情况,可以使用`Iterator`进行迭代并使用`Iterator`的`remove()`方法,或者使用线程安全的集合,如`CopyOnWriteArrayList`,因为其迭代器允许并发修改,不会抛出此异常。 在选择线程安全的集合类时,...
- 如果在迭代过程中添加或删除元素,建议使用`Iterator`的`remove()`方法,而不是集合的`add()`或`remove()`方法,以避免并发修改异常。 总结来说,Java中的迭代器设计模式是集合操作的重要组成部分,它允许程序员...
- 避免在循环中调用`add`、`remove`等改变集合大小的操作,可能导致`ConcurrentModificationException`。 6. **并发编程**: - 使用并发集合类如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,而非普通的同步...