
删除List的三种方式:
(1) 普通遍历 :
@Test
public void testList(){
ArrayList<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
//1. 普通遍历删除 list 中元素
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("one")){
list.remove(i);
}
System.out.println(list.get(i));
}
//result : 普通遍历:删除成功
}
(2) 增强for 循环:
@Test
public void testList(){
ArrayList<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
//2. 增强for循环 删除list中元素
for (String str : list){
if (str.equals("one")){
list.remove("one");
}
System.out.println(str);
}
//result : 抛出异常 -> ConcurrentModificationException
}
(3) 迭代器遍历:
@Test
public void testList(){
ArrayList<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
//3. 迭代器遍历 删除 list中元素
Iterator<String> listIter = list.iterator();
while (listIter.hasNext()){
String next = listIter.next();
if ("one".equals(next)){
listIter.remove();
}
System.out.println(next);
}
//result : 迭代器遍历 删除成功
}
}
总结:
(1)普通遍历 :在代码中,删除元素后,需要把下标减一。这是因为在每次删除元素后,ArrayList会将后面部分的元素依次往上挪一个位置(就是copy),所以,下一个需要访问的下标还是当前下标,所以必须得减一才能把所有元素都遍历完;<for循环适合删除特定一位元素,不适合循环删除特定元素>
(2)增强for循环:不能删除,抛出异常ConcurrentModificationException<list集合在使用中,对象不能发生改变,所以会抛出异常>;
(3)迭代器遍历:正常删除。
迭代器可以正常删除的原因:
迭代器删除元素时,是先使用next()获取元素,然后再remove()删除元素,但是如果next()和remove()之间,集合发生机构性变化(增加,删除)则会抛出IllegalStateException,是因为读完next(),迭代器的位置已经指向下一个,位置不再指向当前元素所在位置。
集合出现了结构性变化(删除或者是增加)则会出现异常IllegalStateException。