【发布时间】: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) 的陷阱有关,反之亦然。这个问题涉及从列表中删除多个项目的问题,其中未来项目的索引已通过删除前面的项目而改变。
标签: java effective-java