java中集合删除元素的两种常用方式及新手易错:
创建集合:
ArrayList<String> aList = new ArrayList<String>();
aList.add("a");
aList.add("b");
aList.add("c");
aList.add("abc");
aList.add("abc");
aList.add("abc");
aList.add("eye");
aList.add("opp");
aList.add("abc");
1、第一种删除方式(利用for循环删除):
for (int i = 0; i < aList.size(); i++) {
if ("abc".equals(aList.get(i))) {
aList.remove(i--);// 索引回溯
}
}
2、第二种删除方法(利用迭代器的remove()方法删除)
ListIterator<String> listIterator = aList.listIterator();
while(listIterator.hasNext()){
String str = listIterator.next();
if ("abc".equals(str)) {
//aList.remove(str); // 集合自身的remove()方法删除
listIterator.remove(); //迭代器的remove() 方法删除
}
}
运行结果:
原集合:a b c abc abc abc eye opp abc
删除后集合:a b c eye opp
1、利用for循环删除时索引没有回溯,导致漏删元素
for(int i = 0 ;i < aList.size(); i++){
if("abc".equals(aList.get(i))){
aList.remove(i);// 索引回溯
}
}
运行结果:
原集合:a b c abc abc abc eye opp abc
删除后集合:a b c abc eye opp
2、使用迭代器循环删除元素时,没有利用迭代器remove方法删除元素而是利用集合自身的remove方法删除元素,
这样会导致“并发修改异常错误”
ListIterator<String> listIterator = aList.listIterator();
while(listIterator.hasNext()){
String str = listIterator.next();
if ("abc".equals(str)) {
aList.remove(str); // 集合自身的remove()方法删除
}
}
运行结果:
原集合:a b c abc abc abc eye opp abc
删除后集合:Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at practice_2.Mianpractice2.main(Mianpractice2.java:42)
并发修改异常错误的产生是因为在生成迭代器后迭代器就已经确定了集合的长度size了,而后集合删除元素后集合的size变小,但是迭代器任然记录的是之前的size数据在迭代过程中产生并发修改异常ConcurrentModificationException,但是如果是使用迭代器的remove()方法来删除元素的话则不会产出这个问题,因为迭代器中的cursor能够自动适应元素删除后集合大小的变化;
所以在删除集合元素时,如果适应迭代器来循环集合元素一定要使用迭代器自身的remove()方法来删除元素;