作为一名菜鸟,经常犯一些不可思议的错误,为了能让自己能不在犯低级错误, 也能让大佬指导一下我,遂记录以分享之。
复制代码
一个List中现在有1——10的元素若干个,需要删除指定名称为3的元素,分别打印删除前和删除后的list。
看到这个题目我的思路是循环遍历list,在遍历的时候,判断符合删除条件的元素,remove掉,这样就能删除掉list中所有符合删除条件的元素。
复制代码
代码如下:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @ClassName DeleteElementOfList
* @Description TODO
* @Author 大大蜡笔小小新
* @Date 2018-10-01 22:20
* @Version 1.0
**/
public class DeleteElementOfList {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(3);
list.add(4);
list.add(5);
System.out.println("删除前:" + list);
// 删除list中为3的元素
for (int i = 0; i < list.size(); i++) {
if (list.get(i) == 3) {
list.remove(list.get(i));
}
}
System.out.println("删除后:" + list);
}
}
复制代码
执行结果如下:
为什么会出现删除元素不干净的情况呢?
这是因为在删除的过程中,list的大小是变化的,存在两个连续的重复元素时,在删除掉第一个符合删除条件元素的同时,list的长度(size)-1,索引也(index)-1,而for循环还是在原来的基础上(list的大小未删除元素时)进行遍历删除,刚好越过了第二个重复元素,故第二个重复元素未删除掉。
复制代码
在删除的时候,我还犯了一个错误,使用foreach循环遍历时进行删除
代码如下:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @ClassName DeleteElementOfList
* @Description TODO
* @Author 大大蜡笔小小新
* @Date 2018-10-01 22:20
* @Version 1.0
**/
public class DeleteElementOfList {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(3);
list.add(4);
list.add(5);
System.out.println("删除前:" + list);
// 删除list中为3的元素
for (Integer num : list) {
if (num == 3) {
list.remove(num);
}
}
System.out.println("删除后:" + list);
}
}
复制代码
执行结果如下:
为什么会抛出异常呢?
foreach方式遍历元素的时候,是生成iterator,然后使用iterator遍历。在生成iterator的时候,会保存一个expectedModCount参数,这个是生成iterator的时候List中修改元素的次数。如果你在遍历过程中删除元素,List中modCount就会变化,如果这个modCount和exceptedModCount不一致,就会抛出异常。
复制代码
那么怎么才能正确的删除掉指定的元素呢?
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @ClassName DeleteElementOfList
* @Description TODO
* @Author 大大蜡笔小小新
* @Date 2018-10-01 22:20
* @Version 1.0
**/
public class DeleteElementOfList {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(3);
list.add(4);
list.add(5);
System.out.println("删除前:" + list);
// 删除list中为3的元素
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
if (iterator.next() == 3) {
iterator.remove();
}
}
System.out.println("删除后:" + list);
}
}
复制代码
执行结果如下:
为什么现在删除正常呢?
如果使用iterator的remove方法则会正常,因为iterator的remove方法会在内部调用List的remove方法,但是会修改excepedModCount的值,因此会正常运行
复制代码
本文是偶然遇到的问题,遂做以记录,我还自己创建了一个公众号,记录日常学习笔记以及遇到的问题,大家可以加一波关注,一起学习,共同进步。
添加个人微信,邀请加入微信群一起学习。