踩坑记录--list.remove()方法陷阱

一、首先说正确的方式

1、让索引同步调整

        for (int i = 0; i < list.size(); i++) {
            Apple apple = list.get(i);
            if(apple.getWeight()==23){
                list.remove(i--);
            }
        }

2、倒序遍历List删除元素

        for (int i = list.size() - 1; i >= 0; i--) {
            Apple apple = list.get(i);
            if (apple.getWeight() == 23) {
                list.remove(i);
            }
        }

3、Iterator.remove() 方法会在删除当前迭代对象的同时,会保留原来元素的索引,建议使用此方式。

        Iterator<Apple> iterator = list.iterator();
        while (iterator.hasNext()) {
            Apple apple = iterator.next();
            if (apple.getWeight() == 23) {
                iterator.remove();
            }
        }

二、错误的删除方式

1、正序遍历

        for (int i = 0; i < list.size(); i++) {
            Apple apple = list.get(i);
            if(apple.getWeight()==23){
                list.remove(i);
            }
        }

2、迭代遍历,用list.remove(i)方法删除元素,抛出异常:java.util.ConcurrentModificationException

        Iterator<Apple> iterator = list.iterator();
        while (iterator.hasNext()) {
            Apple apple = iterator.next();
            if (apple.getWeight() == 23) {
                list.remove(apple);
            }
        }

3、forech删除,抛出异常:java.util.ConcurrentModificationException

        for (Apple apple : list) {
            if (apple.getWeight() == 23) {
                list.remove(apple);
            }
        }

猜你喜欢

转载自blog.csdn.net/qq_36336332/article/details/107191910