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].那里发生了什么?
列表项逐个删除,当从列表中删除项时,后面的所有内容的索引都会被移回.这就是为什么索引最终引用不同的项而不是初始位置.
如果您无法轻易看到这一点,请在调试器中逐步执行代码,或者甚至在纸上逐步"运行"列表操作.
这只是马蒂的答案.我无法在评论中清楚地看到这一点.
添加元素后查看列表:
[-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.您将得到您最初预期的答案.
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |