- Java開發(fā)之道
- 張振坤 李鐘尉 陳丹丹等編著
- 964字
- 2018-12-27 19:53:52
第2篇 陷阱與謬誤——吸取前人的教訓
用經驗和推理跳出技術的陷阱
用事實和原理揭穿謬誤的謊言
深入剖析陷阱與謬誤
第3章 細說開發(fā)人員不可忽略的21個技術陷阱
在編程過程中發(fā)生錯誤是常有的事情,有些錯誤是完全可以避免的,而有些錯誤則好像程序設置的陷阱,稍不留神就會誤入其中。
由于陷阱的存在,往往會給用戶造成不可估計的損失,為此筆者根據(jù)多年的編程經驗,對程序中可能出現(xiàn)的陷阱進行了講解,通過本章學習,希望對編程人員有所幫助,可以減少由于程序中存在的陷阱而給用戶造成的損失。
陷阱1 漏洞百出——使用for刪除集合元素陷阱
1.陷阱產生的場景
for語句在程序開發(fā)中經常被用到,它語法簡單、邏輯嚴謹,完全可以替代其他任何循環(huán)語法,所以說它的可應用范圍最廣泛。但在應用for語句時也要注意,該語句內部的局部自增或自減變量i若處理不當,可能給程序帶來巨大隱患,比如在使用for語句刪除集合中的元素時,就可能出現(xiàn)下面的情況。
例3.1 使用for刪除集合元素時的陷阱。(光盤位置:光盤\MR\Instance\3\01\UseForApp)
import java. util. LinkedList; import java. util. List; public class Program { public static void main (String[] args) { List<String> tempList = new LinkedList<String>(); tempList. add ("A"); tempList. add ("B"); tempList. add ("C"); for (int i = 0; i < tempList. size (); i++) { tempList. remove (i); } if (tempList. size () > 0) { System.out. println ("\n剩余元素的個數(shù)為" + tempList. size ()+",具體元素有:"); for (String item : tempList) { System.out. println (item+" "); } } else { System.out. println ("已刪除所有的元素!"); } } }
本實例的目的是使用for語句刪除集合中的所有元素,上述代碼中描述了使用remove ()方法按照元素的位置索引逐個刪除元素,看起來似乎很完美,但運行結果卻出人意料,程序運行結果如圖3.1所示。

圖3.1 使用for刪除集合元素陷阱
說明
從執(zhí)行結果中,可以得出這樣的判定結論,集合中的元素B在for循環(huán)中并未得到執(zhí)行remove ()方法。由于B元素的索引值為1,這足以說明在使用for語句刪除集合元素的過程中發(fā)生了跳躍,并沒有按照元素在集合中的原始順序逐個地刪除。
進一步分析發(fā)現(xiàn),每當刪除一個元素時,集合的size ()方法的值都會減小1,這將直接導致集合中元素的索引重新排序,進一步說,就是剩余所有元素的索引值都減小1,正如圖3.2所示的那樣,而for語句的局部變量i 仍然在遞增,這必將導致刪除操作發(fā)生跳躍,這就是問題的根源所在。

圖3.2 集合元素刪除示意圖
提示
清除集合中元素的方法很多,本實例并不是僅僅為了說明如何刪除集合的所有元素,而是通過對這種現(xiàn)象的分析,讓讀者體會在使用循環(huán)語句處理集合問題時應該注意什么。
2.陷阱的解決方法
從上面的分析可知,刪除集合中的元素會導致剩余元素的索引重排序,但在完全刪除元素之前,索引值為0的元素一直存在,這就是解決問題的一個著手點。解決問題的辦法可這樣考慮,在remove ()方法被執(zhí)行后,就使局部變量i的值減少1,從而始終保持i的值為0,這樣每次循環(huán)都刪除索引值為0的元素,最終實現(xiàn)刪除集合中的所有元素。改正后的主要代碼如下:
for (int i = 0; i < tempList. size (); i++) { tempList. remove (i); //始終刪除索引值為0的元素 i -= 1; //局部變量i的值減去1 }
技巧
要刪除List集合中的所有元素,還可使用該泛型集合的clear ()方法,該方法用于移除當前集合中的所有元素。
- Mastering NetBeans
- Oracle Exadata性能優(yōu)化
- 測試驅動開發(fā):入門、實戰(zhàn)與進階
- Java完全自學教程
- Mastering Ember.js
- 實戰(zhàn)低代碼
- Easy Web Development with WaveMaker
- Learning AndEngine
- 3D少兒游戲編程(原書第2版)
- Getting Started with Gulp
- C++新經典
- Tableau 10 Bootcamp
- Cybersecurity Attacks:Red Team Strategies
- Learning Unreal Engine Android Game Development
- Webpack實戰(zhàn):入門、進階與調優(yōu)(第2版)