我现在正在阅读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]。那里发生了什么?
答案 0 :(得分:5)
逐个删除列表项,当从列表中删除项时,后面的所有内容的索引都会被移回。这就是为什么索引最终引用不同的项而不是初始位置。
如果您无法轻易看到这一点,请在调试器中逐步执行代码,甚至运行&#34;运行&#34;列表操作在纸上手动,一步一步。
答案 1 :(得分:5)
这只是详细阐述了Matti的答案。我无法在评论中清楚地看到这一点。
添加元素后查看列表:
[-3 -2 -1 0 1 2]
删除元素0
[-2 -1 0 1 2]
删除元素1 - 现在与旧元素2相同
[-2 0 1 2]
删除元素2 - 现在与旧元素4相同
[-2 0 2]
我们走了。
为了使其更清晰,请尝试颠倒for
的顺序并删除元素2,然后删除1,然后是0.您将得到原先预期的答案。