`

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics