购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

陷阱1

漏洞百出
——使用for删除集合元素陷阱

1.陷阱产生的场景

for语句在程序开发中经常被用到,它语法简单、逻辑严谨,完全可以替代其他任何循环语法,所以说它的可应用范围最广泛。但在应用for语句时也要注意,该语句内部的局部自增或自减变量i若处理不当,可能给程序带来巨大隐患,比如在使用for语句删除集合中的元素时,就可能出现下面的情况。

例3.1 使用for删除集合元素时的陷阱。(光盘位置:光盘\MR\Instance\3\01\UseForApp)

本实例的目的是使用for语句删除集合中的所有元素,上述代码中描述了使用remove()方法按照元素的位置索引逐个删除元素,看起来似乎很完美,但运行结果却出人意料,程序运行结果如图3.1 所示。

图3.1 使用for删除集合元素陷阱

说 明

从执行结果中,可以得出这样的判定结论,集合中的元素B在for循环中并未得到执行remove()方法。由于B元素的索引值为 1,这足以说明在使用for语句删除集合元素的过程中发生了跳跃,并没有按照元素在集合中的原始顺序逐个地删除。

进一步分析发现,每当删除一个元素时,集合的size()方法的值都会减小 1,这将直接导致集合中元素的索引重新排序,进一步说,就是剩余所有元素的索引值都减小 1,正如图3.2 所示的那样,而for语句的局部变量i仍然在递增,这必将导致删除操作发生跳跃,这就是问题的根源所在。

图3.2 集合元素删除示意图

提 示

清除集合中元素的方法很多,本实例并不是仅仅为了说明如何删除集合的所有元素,而是通过对这种现象的分析,让读者体会在使用循环语句处理集合问题时应该注意什么。

2.陷阱的解决方法

从上面的分析可知,删除集合中的元素会导致剩余元素的索引重排序,但在完全删除元素之前,索引值为0的元素一直存在,这就是解决问题的一个着手点。解决问题的办法可这样考虑,在remove()方法被执行后,就使局部变量i的值减少 1,从而始终保持i的值为 0,这样每次循环都删除索引值为0的元素,最终实现删除集合中的所有元素。改正后的主要代码如下:

技 巧

要删除List集合中的所有元素,还可使用该泛型集合的clear()方法,该方法用于移除当前集合中的所有元素。 w0W4NIySytFi4Y3Uxd/XiTU+n78eouFgbWpSi3KVRO/atHDZsjZc+CsnzBvkh4k2

点击中间区域
呼出菜单
上一章
目录
下一章
×