- Java開發之道
- 張振坤 李鐘尉 陳丹丹等編著
- 52字
- 2018-12-27 19:53:52
第2篇 陷阱與謬誤——吸取前人的教訓
用經驗和推理跳出技術的陷阱
用事實和原理揭穿謬誤的謊言
深入剖析陷阱與謬誤
第3章 細說開發人員不可忽略的21個技術陷阱
在編程過程中發生錯誤是常有的事情,有些錯誤是完全可以避免的,而有些錯誤則好像程序設置的陷阱,稍不留神就會誤入其中。
由于陷阱的存在,往往會給用戶造成不可估計的損失,為此筆者根據多年的編程經驗,對程序中可能出現的陷阱進行了講解,通過本章學習,希望對編程人員有所幫助,可以減少由于程序中存在的陷阱而給用戶造成的損失。
陷阱1 漏洞百出——使用for刪除集合元素陷阱
1.陷阱產生的場景
for語句在程序開發中經常被用到,它語法簡單、邏輯嚴謹,完全可以替代其他任何循環語法,所以說它的可應用范圍最廣泛。但在應用for語句時也要注意,該語句內部的局部自增或自減變量i若處理不當,可能給程序帶來巨大隱患,比如在使用for語句刪除集合中的元素時,就可能出現下面的情況。
例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剩余元素的個數為" + tempList. size ()+",具體元素有:"); for (String item : tempList) { System.out. println (item+" "); } } else { System.out. println ("已刪除所有的元素!"); } } }
本實例的目的是使用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的元素,最終實現刪除集合中的所有元素。改正后的主要代碼如下:
for (int i = 0; i < tempList. size (); i++) { tempList. remove (i); //始終刪除索引值為0的元素 i -= 1; //局部變量i的值減去1 }
技巧
要刪除List集合中的所有元素,還可使用該泛型集合的clear ()方法,該方法用于移除當前集合中的所有元素。
- 新編Visual Basic程序設計上機實驗教程
- Intel Galileo Essentials
- 零基礎PHP學習筆記
- Learn to Create WordPress Themes by Building 5 Projects
- 物聯網系統開發:從0到1構建IoT平臺(第2版)
- Python爬蟲開發與項目實戰
- Blender 3D Incredible Machines
- JavaScript從入門到精通(第3版)
- Mastering Kali Linux for Web Penetration Testing
- YARN Essentials
- Lua程序設計(第4版)
- 大學計算機基礎(第2版)(微課版)
- 詳解MATLAB圖形繪制技術
- ExtJS Web應用程序開發指南第2版
- 平面設計經典案例教程:CorelDRAW X6