关于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 解决方法 在使用iterator.hasNext()操作迭代器的时候,如果此时迭代的对象发生改变,比如插入了新数据,或者有数据被删除。 则使用会报以下异常: Java.util....
主要介绍了出现java.util.ConcurrentModificationException 问题及解决办法的相关资料,需要的朋友可以参考下
Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException:java.lang.OutOfMemoryError),内附解决方案!
1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
详细介绍了java.util.logging.Logger的用法和结构,对如果扩展Logger起到抛砖引玉的作用!尊重劳动成果,亲下载了要给个评价!
axis2解决 org.apache.axis2.util.JavaUtils.callStackToString问题
本文通过对数据压缩算法的简要介绍,然后以详细的示例演示了利用java.util.zip包实现数据的压缩与解压,并扩展到在网络传输方面如何应用java.util.zip包现数据压缩与解压
net.mindview.util包(Thinking in Java 4#)
java.util.Date与java.sql.Date互转及字符串转换为日期时间格式.docx
java并发工具包 java.util.concurrent中文版-带书签版
Exception in thread “main“ java.util.InputMismatchException
java并发工具包 java.util.concurrent中文版pdf
字符串工具类,判定字符串是否为空等,封装各种字符串工具方法每个方法都有注释
予org.jasig.cas.client.util.CommonUtils 加入 public static void disableSSLVerification(){ try { // Create a trust manager that does not validate certificate chains TrustManager[] ...
详细介绍java.util.Date和java.sql.Date相互转换的多种方法总结,希望对大家有帮助
java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...
<Call Stack = DEBUG_FRAME = org.apache.axis2.util.JavaUtils.callStackToString(JavaUtils.java:564) DEBUG_FRAME = org.apache.axis2.description.ParameterIncludeImpl.debugParameterAdd(ParameterIncludeImpl...
Java并发编程工具包java.util.concurrent的UML类结构图 PDF