谁能解释一下 Joshua Bloch 第 41 条的例子? [复制]

Posted

技术标签:

【中文标题】谁能解释一下 Joshua Bloch 第 41 条的例子? [复制]【英文标题】:Can anyone explain me example from Joshua Bloch item 41? [duplicate] 【发布时间】:2014-05-30 13:55:24 【问题描述】:

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

【问题讨论】:

这个问题不是问题“正确地从列表中删除一个整数”的副本。该问题与在预期 remove(Object o) 时调用 remove(int index) 的陷阱有关,反之亦然。这个问题涉及从列表中删除多个项目的问题,其中未来项目的索引已通过删除前面的项目而改变。 【参考方案1】:

列表项被逐一删除,当项目从列表中删除时,其后所有内容的索引都会移回。这就是索引最终引用的项目与初始位置不同的原因。

如果您不能轻易看到这一点,请在调试器中逐步执行代码,甚至在纸上手动“运行”列表操作,逐步进行。

【讨论】:

【参考方案2】:

这只是在详细阐述马蒂的回答。我无法在评论中清楚地了解这一点。

查看添加元素后的列表:

[-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。您将得到您最初期望的答案。

【讨论】:

以上是关于谁能解释一下 Joshua Bloch 第 41 条的例子? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Joshua Bloch 在 Effective Java 中解释的枚举类型

有效的 Java 由 Joshua Bloch:Item1 - 静态工厂方法

谁能解释一下他们这里的图片是怎么分割的?

谁能解释一下栅栏密码??

请解释一下JQuery中$(deg: 0)的含义

谁能解释一下Java中GridBagLayout的使用?