欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于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 remove