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

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

主站蜘蛛池模板: 布尔津县| 共和县| 鄂伦春自治旗| 邵武市| 赣州市| 郴州市| 枣强县| 金坛市| 轮台县| 长顺县| 镇宁| 广宁县| 峨眉山市| 东光县| 大余县| 色达县| 鲁甸县| 青海省| 二连浩特市| 濉溪县| 黎城县| 渝北区| 丰台区| 隆回县| 睢宁县| 白玉县| 邢台市| 晋州市| 鄢陵县| 通道| 云霄县| 成都市| 元氏县| 舞阳县| 两当县| 扬中市| 施甸县| 瑞金市| 德昌县| 保德县| 保康县|