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);
}
}
}