关于java List的remove方法导致的异常java.util.ConcurrentModificationException
程序员文章站
2022-07-12 22:07:40
...
关于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 list.remove( )方法需要注意的地方
-
关于java List的remove方法导致的异常java.util.ConcurrentModificationException
-
Java中List遍历删除元素remove()的方法
-
Java List的remove()方法陷阱以及性能优化
-
Java List的remove()方法踩坑
-
关于集合List的remove方法要注意的坑
-
Java list.remove( )方法需要注意的地方
-
关于java的List集合对象去重及按属性去重的8种方法
-
关于json报java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher 异常的解决方法
-
Java中List.remove()方法的bug