通常需要把List中的某些元素进行删除,容易犯的错误就是直接做循环,然后if判断进行删除,这种往往会报错,因为列表大小以及指针同时改变了,之所以说往往,是因为删除某些元素时并不会报错。如下所示:
//main函数
public static void main(String[] args) {
List<String> originList = new ArrayList<String>();
for(int i = 0; i < 5; i++) {
originList.add(i + "");
}
delete1(originList, "2");//错误的写法
delete1(originList, "2");//正确的写法
System.out.println(originList);
}
/**
* 第一种写法,错误的写法,list在循环过程中删除自己的元素
*/
private static void delete1(List<String> list, String string) {
for(String str : list) {
if(string.equals(str)) {
list.remove(string);
}
}
}
Exception in thread “main” java.util.ConcurrentModificationException
at
java.util.ArrayList
Itr.checkForComodification(ArrayList.java:901)atjava.util.ArrayList
Itr.next(ArrayList.java:851)
at testJava.TestDeleteEleInList.delete1(TestDeleteEleInList.java:21)
at testJava.TestDeleteEleInList.main(TestDeleteEleInList.java:13)
但是在例子中删除元素”3”时并不会报错,输出的是正确的结果,所以这个错误隐藏得有点深。
正确的写法应该为使用Iterator进行遍历
/**
* 正确的写法
*/
private static void delete2(List<String> originList, String string) {
Iterator<String> iterator = originList.iterator();
while (iterator.hasNext()) {
String temp = iterator.next();
if(string.equals(temp)) {
iterator.remove();
}
}
}