`

关于java List的remove方法导致的异常java.util.ConcurrentModificationException

阅读更多

关于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 异常问题详解1

    Java.util.ConcurrentModificationException 异常问题详解 ConcurrentModificationException 异常是 Java 中一个常见的异常,它发生在 Iterator 遍历集合时,集合同时被修改引起的异常。在 Java 中,集合类如 ...

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

    在Java编程中,`ConcurrentModificationException`是一个常见的运行时异常,主要出现在多线程环境下对集合类(如List、Set、Map等)进行并发修改时。然而,这个异常不仅限于多线程环境,即使在单线程中,如果在遍历...

    Java语言的Util类详细介绍

    但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除元素),Iterator将抛出ConcurrentModificationException异常。 Set接口是Collection接口的子接口...

    阿里巴巴Java开发手册(终极版).zip

    可以使用`Iterator`或`List.removeIf()`等方法。 3. **线程安全**:对多线程环境下的代码要特别注意,避免数据竞争和死锁,合理使用`synchronized`关键字或`java.util.concurrent`包中的工具类。 三、设计模式 1. ...

    Java源码分析:深入探讨Iterator模式

    在Java编程语言中,集合框架(`java.util`包)提供了多种容器类来存储对象,如`List`、`Set`和`Map`等。为了遍历这些容器中的元素,Java引入了迭代器模式(Iterator Pattern),这是一种常用的设计模式,它提供了一...

    详解Java 集合类 List 的那些坑

    详解 Java 集合类 List ...List 并不是我们常用的 java.util.ArrayList,而是 Arrays 的静态内部类 java.util.Arrays.ArrayList,该类继承自抽象类 java.util.AbstractList,但没有实现 add 方法,默认抛出 java.lang_...

    java Iterator迭代器的使用

    4. **示例代码:MyIterator.java** 我们可以创建一个简单的程序,演示如何使用`Iterator`遍历ArrayList: ```java import java.util.ArrayList; import java.util.Iterator; public class MyIterator { ...

    Java程序员容易犯的10个错误

    正确做法是使用迭代器,但使用增强for循环(for-each)配合`list.remove()`会抛出`ConcurrentModificationException`。正确的迭代器移除方式如下: ```java Iterator&lt;String&gt; iter = list.iterator(); while ...

    迭代大师的修炼之道:Java中Iterator与增强for循环的深度解析

    import java.util.List; import java.util.Arrays; public class EnhancedForLoopExample { public static void main(String[] args) { List&lt;String&gt; names = Arrays.asList("Ada Lovelace", "Alan Turing", ...

    java 迭代及迭代器的小例子

    迭代器接口定义在java.util包中,它提供了三个主要的方法:`hasNext()`、`next()`和`remove()`。`hasNext()`用于检查集合中是否还有更多元素,`next()`返回下一个元素,而`remove()`则删除当前元素。下面是一个使用...

    java集合代码

    ArrayList是Java中`java.util`包下的一个类,它是List接口的一个具体实现。ArrayList基于动态数组,允许我们在列表的任何位置插入和删除元素,提供了快速访问元素的能力。其内部实现通过扩容机制来保证在添加元素时...

    Java程序员们最常犯的10个错误.docx

    在`for-each`循环中删除元素会引发`ConcurrentModificationException`,因为编译器自动调用`.next()`在`.remove()`之后,而迭代器要求`.next()`在`.remove()`之前调用。 4. **Hashtable与HashMap的区别**: 这...

    java-大数据基础面试思考.pdf

    它允许双向遍历List,并且可以使用add()、remove()和set()方法来修改列表。与Iterator只能向前遍历不同,ListIterator提供了hasPrevious()和previous()方法,允许逆向遍历。同时,ListIterator可以知道它的当前索引...

    JAVA初学教程教你学会JAVA4

    当迭代器检测到列表在迭代过程中发生了改变时,它会抛出`ConcurrentModificationException`异常,以避免潜在的数据不一致性问题。 这种机制通过维护一个名为`modCount`的域来实现,每次列表发生结构性变化时(如...

    内置迭代器的linked list例题

    此外,如果在迭代期间直接修改集合(如使用`add()`、`remove()`等方法,而不是通过迭代器),可能会导致`ConcurrentModificationException`,因为这破坏了迭代器的内部状态。 总结来说,Java的LinkedList与内置迭代...

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

    在Java编程中,遍历并删除List集合是一个常见的操作,但在实际编程中,如果不使用正确的方法,可能会导致`java.util.ConcurrentModificationException`异常。本文主要针对这个面试题,详细讲解如何在遍历List的同时...

    Java实训 Java高级应用编程 第2章 集合(共33页).ppt

    在Java中,集合类位于`java.util`包内,它们为程序员提供了一种灵活的方式来存储和操作对象。 1. **集合概述**: - 集合是一个容器,可以容纳一组对象,每个对象作为一个元素存在。 - 与数组相比,集合具有动态...

    Java的CopyOnWriteArrayList功能详解,及无法保证数据是实时同步.docx

    为了避免这种情况,可以使用`Iterator`进行迭代并使用`Iterator`的`remove()`方法,或者使用线程安全的集合,如`CopyOnWriteArrayList`,因为其迭代器允许并发修改,不会抛出此异常。 在选择线程安全的集合类时,...

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

    - 如果在迭代过程中添加或删除元素,建议使用`Iterator`的`remove()`方法,而不是集合的`add()`或`remove()`方法,以避免并发修改异常。 总结来说,Java中的迭代器设计模式是集合操作的重要组成部分,它允许程序员...

    阿里巴巴java开发手册1.40版

    - 避免在循环中调用`add`、`remove`等改变集合大小的操作,可能导致`ConcurrentModificationException`。 6. **并发编程**: - 使用并发集合类如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,而非普通的同步...

Global site tag (gtag.js) - Google Analytics