?
From:http://hi.baidu.com/xiami9910/blog/item/caeda23621e560d8a2cc2b51.html
?
import java.util.*;
public class object {
public static void main(String[] args) {
? ?String str1 = new String("abcde");
? ?String str2 = new String("abcde");
? ?String str3 = new String("abcde");
? ?String str4 = new String("abcde");
? ?String str5 = new String("abcde");
? ?List list = new ArrayList();
? ?list.add(str1);
? ?list.add(str2);
? ?list.add(str3);
? ?list.add(str4);
? ?list.add(str5);
? ?System.out.println("list.size()=" + list.size());
? ?for (int i = 0; i < list.size(); i++) {
? ? if (((String) list.get(i)).startsWith("abcde")) {
? ? ?list.remove(i);
? ? }
? ?}
? ?System.out.println("after remove:list.size()=" + list.size());
}
}
?
运行结果不是:
?
list.size()=5
after remove:list.size()=0
?
居然是:
?
list.size()=5
after remove:list.size()=2
?
原因: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;
?
? ?}
}
?
======================================================================
边遍历ArrayList边删除元素抛java.util.ConcurrentModification?
执行下列代码:
?
if (CollectionUtils.isNotEmpty(list)) {
? Iterator it = list.iterator();
? while (it.hasNext()) {
?OfferMigPlan offerMigPlan = (OfferMigPlan) it.next();
?if(setCommonAttributes(offerMigPlan)==null){
?list.remove(offerMigPlan);
? }
?}
}
?
?
抛出异常java.util.ConcurrentModification,为什么?因为我们在遍历的时候,删除了list里面的一个元素,相应的后面的元素都在list中网上进一个位置,然而在迭代器的相应位置却未删除。
?
Solution:使用Iterator.remove()方法,该方法可删除由Iterator生成的上一个元素。所以每次调用next()的时候,只需调用remove()一次。
?
if (CollectionUtils.isNotEmpty(list)) {
? Iterator it = list.iterator();
? while (it.hasNext()) {
?OfferMigPlan offerMigPlan = (OfferMigPlan) it.next();
?if(setCommonAttributes(offerMigPlan)==null){
?
? it.remove();
?list.remove(offerMigPlan);
? }
?}
}
?