ArrayList 循环遍历并删除指定元素

一个 ArrayList 的集合,删除部分指定的元素,看似一个很简单的需求,却很容易出现问题。

public class Test2 {

    @Test
    public void test() {
        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("B");
        list.add("C");
        list.add("A");
        list.add("F");
        list.add("B");
        list.add("E");
        System.out.println(list);

        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            if (StringUtils.equals(s,"B")) {
                list.remove(i);
            }
        }
        System.out.println(list);
    }
    
}

控制台输出:
[A, B, B, C, A, F, B, E]
[A, B, C, A, F, E]

为什么 A 与 C 之间,两个 B,只有一个被移除了?

ArrayList底层用的是数组实现,当第一个 B 被移除后,数组长度由8变为了7,但 i 的值没有做相应的改变,导致第一 B 后的元素,没有参与校验,就向后执行了

优化方式 1:

public class Test2 {

    @Test
    public void test() {
        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("B");
        list.add("C");
        list.add("A");
        list.add("F");
        list.add("B");
        list.add("E");
        System.out.println(list);

        for (int i = 0; i < list.size(); i++) {
            String s = list.get(i);
            if (StringUtils.equals(s,"B")) {
                list.remove(i);
                i--;
            }
        }
        System.out.println(list);
    }

}

控制台输出:
[A, B, B, C, A, F, B, E]
[A, C, A, F, E]

优化方式 2:

public class Test2 {

    @Test
    public void test() {
        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("B");
        list.add("C");
        list.add("A");
        list.add("F");
        list.add("B");
        list.add("E");
        System.out.println(list);

        for (int i = list.size() - 1; i >= 0; i--) {
            String s = list.get(i);
            if (StringUtils.equals(s,"B")) {
                list.remove(i);
            }
        }
        System.out.println(list);
    }

}

优化方式 3:

public class Test2 {

    @Test
    public void test() {
        List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("B");
        list.add("C");
        list.add("A");
        list.add("F");
        list.add("B");
        list.add("E");
        System.out.println(list);

        Iterator<String> iterator = list.iterator();
        while (iterator.hasNext()) {
            if (StringUtils.equals(iterator.next(),"B")) {
                iterator.remove();
            }
        }

        System.out.println(list);
    }

}

控制台输出:
[A, B, B, C, A, F, B, E]
[A, C, A, F, E]
经验分享 程序员 微信小程序 职场和发展