This question already has answers here:
Properly removing an Integer from a List<Integer>
(8个答案)
6年前关闭。
我现在正在阅读Joshua Bloch的“ Effective Java”,当我阅读第41条“明智地使用重载”时,由于这里使用的示例,我感到困惑。我在计算机上尝试过它,的确做到了它在书中所做的。但是我不明白为什么!
这是这个例子:
它输出:
我了解此示例中的list.remove()应该按索引删除,但事实并非如此!在列表中填充值后,其值为:[-3,-2,-1、0、1、2]。因此,当我们删除0、1和2元素时,我们应该停留在[0,1,2]而不是[-2,0,2]。那里发生了什么事?
(8个答案)
6年前关闭。
我现在正在阅读Joshua Bloch的“ Effective Java”,当我阅读第41条“明智地使用重载”时,由于这里使用的示例,我感到困惑。我在计算机上尝试过它,的确做到了它在书中所做的。但是我不明白为什么!
这是这个例子:
public class SetList {
public static void main(String[] args) {
Set<Integer> set = new TreeSet<Integer>();
List<Integer> list = new ArrayList<Integer>();
for (int i = -3; i < 3; i++) {
set.add(i);
list.add(i);
}
for (int i = 0; i < 3; i++) {
set.remove(i);
list.remove(i);
}
System.out.println(set + " " + list);
}
}
它输出:
[-3, -2, -1] [-2, 0, 2]
我了解此示例中的list.remove()应该按索引删除,但事实并非如此!在列表中填充值后,其值为:[-3,-2,-1、0、1、2]。因此,当我们删除0、1和2元素时,我们应该停留在[0,1,2]而不是[-2,0,2]。那里发生了什么事?
最佳答案
列表项被一一删除,并且从列表中删除项时,其后所有内容的索引都移回。这就是为什么索引最终引用的项与初始位置不同。
如果您不容易看出这一点,请逐步在调试器中浏览代码,甚至逐步在纸上手动“运行”列表操作。
08-05 06:48