最近在复习JAVASE,对集合知识进行了一些总结:list集合的三种遍历方式以及是否能够删除
1. 普通for循环
//01:普通的for循环删除
@Test
public void Demo1(){
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
for(int i=0;i<list.size();i++){
if("b".equals(list.get(i))){
list.remove(i--); //删除成功,进行i--操作,将i重新指向下标为0的地方
}
}
System.out.println(list);
}
运行结果:[a, c, d, e, f]
2. 迭代器删除
@Test
//02:迭代器删除
public void Demo2(){
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
Iterator<String> iterator = list.Iterator();
while (iterator.hasNext()) {
if("b".equals(iterator.next())){
list.remove("b"); //不能用集合的删除方法,因为在删除过程集合修改会产生并发异常
}
}
System.out.println(list);
}
运行结果:java.util.ConcurrentModificationException
在迭代器内部调用集合的删除方法会报并发异常,包括使用集合的add()方法也会报该异常,解决办法就是使用listIterator提供的remove()和add()方法
@Test
//02:迭代器删除
public void Demo2(){
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
ListIterator<String> iterator = list.listIterator();
while (iterator.hasNext()) {
if("b".equals(iterator.next())){
iterator.remove();
}
}
运行结果:[a, c, d, e, f]
3. 增强for循环删除
@Test
//03:增强for循环方法
public void Demo3(){
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
for (String string : list) {
if("b".equals(string)){
list.remove("b"); //删除不成功,因为增强for循环依赖于迭代器,迭代器中不能调用list的remove()方法,所以增强for循环不能删除元素
}
}
}
运行结果:java.util.ConcurrentModificationException
而为什么在增强for循环里面调用list的remove()方法会报并发异常呢?原因就是:java的增强for循环其实就是根据list对象创建了一个迭代器,然后根据这个迭代器遍历集合,而在对增强for循环中对list进行增删操作的时候,都是经过迭代器,而在迭代器中直接使用list的remove()和add()方法会报并发修改异常(ConcurrentModificationException)