任何人都能解释一下约书亚布洛赫第41项的例子吗?

时间:2014-04-16 00:20:17

标签: java effective-java

我现在正在阅读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]。那里发生了什么?

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.您将得到原先预期的答案。