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方法会改变下标并且有重载方法会引发错误.