任何人都可以用约书亚布洛赫第41项解释我的例子吗?

myk*_*ola 2 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

它输出:

[-3, -2, -1] [-2, 0, 2]

我知道这个例子中的list.remove()应该通过索引删除,但它不会!在列表填充值后,它是:[ - 3,-2,-1,0,1,2].因此,当我们删除0,1和2个元素时,我们应该使用[0,1,2],而不是[-2,0,2].那里发生了什么?

Mat*_*nen 5

列表项逐个删除,当从列表中删除项时,后面的所有内容的索引都会被移回.这就是为什么索引最终引用不同的项而不是初始位置.

如果您无法轻易看到这一点,请在调试器中逐步执行代码,或者甚至在纸上逐步"运行"列表操作.


tim*_*mbo 5

这只是马蒂的答案.我无法在评论中清楚地看到这一点.

添加元素后查看列表:

[-3 -2 -1 0 1 2]
Run Code Online (Sandbox Code Playgroud)

删除元素0

[-2 -1 0 1 2]
Run Code Online (Sandbox Code Playgroud)

删除元素1 - 现在与旧元素2相同

[-2 0 1 2]
Run Code Online (Sandbox Code Playgroud)

删除元素2 - 现在与旧元素4相同

[-2 0 2]
Run Code Online (Sandbox Code Playgroud)

我们走了.

为了使它更清晰,尝试颠倒for和删除元素2 的顺序,然后是1,然后是0.您将得到您最初预期的答案.