官术网_书友最值得收藏!

第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 ()方法,該方法用于移除當前集合中的所有元素。

主站蜘蛛池模板: 堆龙德庆县| 兴海县| 离岛区| 洛川县| 衡水市| 南木林县| 化德县| 福建省| 绍兴县| 大田县| 德兴市| 淄博市| 申扎县| 疏勒县| 邵武市| 吉安市| 三江| 登封市| 焉耆| 米脂县| 西安市| 阿拉善盟| 蓬溪县| 忻州市| 鄂州市| 鄂尔多斯市| 北宁市| 阿克陶县| 广元市| 保山市| 安图县| 高州市| 西乌珠穆沁旗| 北川| 平湖市| 绥江县| 镇巴县| 库尔勒市| 长春市| 福清市| 黑山县|