List remove方法小坑

1. 先看一段代码

Set<Integer> set = new TreeSet<>();
        List<Integer> list = new ArrayList<>();
        for (int i = -3; i <3 ; i++) {
            set.add(i);
            list.add(i);
        }
        System.out.println(set + " " + list);
        for (int i = 0; i <3 ; i++) {
            set.remove(i);
            list.remove(i);
        }
        System.out.println(set + " " + list);

list 和 set 存放了 [-3, -2, -1, 0, 1, 2] 这几个数字,我们删除 0  1  2 , 得到的结果应该是[-3, -2, -1].

但是结果并不是这样,结果set是 [-3, -2, -1],但是list[-2, 0, 2].

为什么会出现这样结果?

2.原因

会出现上面的原因主要和重载有关系,set只有一个remove(Object o)方法,但是list却有remove(int index)和remove(Object obj)两个方法.

这里传入的是i是int类型的,所以就调用了remove(int index)方法,删除了0 1 2 的下标,删除0的时候list的大小会改变,下标0也就编程了 -2,1变成了-1,所以就出现了[-2, 0, 2]的结果.

所以在这里要删除的话最好用Iterator迭代器迭代每个元素,然后用迭代器的remove方法删除.

list的remove方法会改变下标并且有重载方法会引发错误.

原文地址:https://www.cnblogs.com/lishuaiqi/p/12960827.html