最初以为用一个简单的for循环就解决了,但忽略了移除后会改变集合的大小发生一些越界的错误或者数据不对;
正确的方式:迭代器Iterator;下面是网上的一个小例子;最后贴出自己错误的代码帮助记忆。
import java.util.ArrayList;
import java.util.Iterator;
public class TestList {
public static void main(String[] args) {
test1();
test2();
test3();
}
public static void test1() {
ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("two");
list.add("two");
list.add("two");
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("two")) {
list.remove(i);
}
}
System.out.println("test1 : " + list);
}
public static void test2() {
ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("two");
list.add("two");
list.add("two");
for (String s : list) {
if (s.equals("two")) {
list.remove(s);
}
}
System.out.println("test2 : " + list);
}
public static void test3() {
ArrayList<String> list = new ArrayList<String>();
list.add("one");
list.add("two");
list.add("two");
list.add("two");
list.add("two");
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
String s = iter.next();
if (s.equals("two")) {
iter.remove();
}
}
System.out.println("test3 : " + list);
}
}
第一个方法输出
test1 : [one, two, two]
第二个方法报错
Exception in thread "main" Java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at TestList.test2(TestList.java:34)
at TestList.main(TestList.java:8)
第三个方法输出
test3 : [one]
注:自己错误例子
//查询商户下面所有板块规则
if(wmPlates != null && wmPlates.size() > 0) {
//for循环的这个是错误的;同时对集合的判空做很差;会出现错误数据或者直接抛出异常
for (int i = 0; i < wmPlates.size(); i++) {
WmTablebookruleExample example = new WmTablebookruleExample();
example.createCriteria().andStoreIdEqualTo(Integer.parseInt(storeId)).andPlateIdEqualTo(wmPlates.get(i).getId()).andStatusEqualTo(0).andIsDeleteEqualTo(0);
List<WmTablebookrule> tableRuleList = tablebookruleService.selectByExample(example);
if(tableRuleList != null && tableRuleList.size() > 0) {
} else {
wmPlates.remove(i);
}
}
Iterator<WmPlate> it = wmPlates.iterator();
while(it.hasNext()){
WmPlate plate = it.next();
WmTablebookruleExample example = new WmTablebookruleExample();
example.createCriteria().andStoreIdEqualTo(Integer.parseInt(storeId)).andPlateIdEqualTo(plate.getId()).andStatusEqualTo(0).andIsDeleteEqualTo(0);
List<WmTablebookrule> tableRuleList = tablebookruleService.selectByExample(example);
if(null == tableRuleList || tableRuleList.size() == 0) {
it.remove();
}
}
}