<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    瘋狂

    STANDING ON THE SHOULDERS OF GIANTS
    posts - 481, comments - 486, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
       考慮以下代碼:此問題以前在javaeye上看見過,不過在我們的代碼評審的時候仍然發現相同問題,代碼看著很正常,但結果卻差之千里。
    目的:刪除list里面的所有元素。
    List list = new ArrayList();   
        list.add("1");   
        list.add("2");   
        list.add("3");   
        list.add("4");   
        list.add("5");   
        list.add("6");    
        for (int i = 0; i < list.size(); i++) {    
            list.remove(i);   
        }
    for (int i = 0; i < list.size(); i++) {   

                System.out.println(list.get(i));   

            } 


    結果:
    2
    4
    6
    為什么沒刪除完,分析一下:
    當在刪除的過程中,i 在變大,但是list中的元素的位置則在變小,例如:

    當刪掉第一個元素的時候,第二個元素的index立馬變成o,而這時候i卻成了1 這就導致index為0的元素無法刪除。
    這種情況問題很難發現。
    但有的人喜歡這樣寫,到是能及時發現問題:
     int n = list.size();
        for (int i = 0; i < n; i++) {   
            list.remove(i);   
        }
    這個時候就會拋出 java.lang.IndexOutOfBoundsException異常,原因很明顯,list的size是在每次刪除的時候都減1,而n卻一直沒變,最終導致越界。
    當然有的人提出改進的方法:
    for (int i = list.size() - 1; i >= 0; i--) {   

                list.remove(i);   

            }

    這樣確實能全部刪除,但是存在僥幸。因為和我們實際的想法有悖的,我們的想法是從大到小刪除,但是實際上發生的事情確實我們總是在刪除最大的。分析一下:
    當刪除list中index最大的元素后,原來倒數第二個元素變為最大,但是index變為原來的size-1,通過i也變成size-1。最終原來index為0 的元素變為index最大的元素。
     
      個人總結出的原則:1 盡量不要讓單個for循環中的兩個邊界發生變化,這樣我們可以對游標(i)的變化心里有數。
                                            2  不要把游標(i)和不斷變化的資源位置掛鉤,這樣我們可以對資源的變化心里有數。
    關于list的刪除方法就不在這將了,不管用iterator,還是其他的
    總的來說,讓程序按照我們的設計步驟進行才是成功的。就像這幾天的嫦娥2號,要是發生這樣的事情,就慘了,本來要先點一級火箭,再二級,再三級,結果一級點了,就直接3級了,估計也沒法繞月了,這是多么大的損失啊。


    評論

    # re: 讓程序向衛星發射一樣受控:謹慎在for循環中的使用集合的remove(int index)   回復  更多評論   

    2010-10-08 09:33 by Chase
    這個確實沒注意到,LZ提醒了我,不錯不錯

    # re: 讓程序向衛星發射一樣受控:謹慎在for循環中的使用集合的remove(int index)   回復  更多評論   

    2010-10-08 23:32 by landas
    請使用Iterator.remove()

    # re: 讓程序向衛星發射一樣受控:謹慎在for循環中的使用集合的remove(int index)   回復  更多評論   

    2010-10-09 10:58 by @joe
    此文是方法論而非方法實現。

    # re: 讓程序向衛星發射一樣受控:謹慎在for循環中的使用集合的remove(int index)   回復  更多評論   

    2010-10-17 13:47 by liudecai
    提醒的好,前不久一個同事就這樣做了一把。他開始還以為遇上了靈異事件了。

    # re: 讓程序向衛星發射一樣受控:謹慎在for循環中的使用集合的remove(int index)   回復  更多評論   

    2013-11-18 16:28 by java菜
    for (int i = 0; i < list.size(); i++) {
    list.remove(i);
    i--;
    }
    主站蜘蛛池模板: 亚洲成在人线aⅴ免费毛片| 91福利免费网站在线观看| 国产一级淫片a免费播放口之| 国产亚洲美女精品久久久久| 亚洲情XO亚洲色XO无码| 又粗又大又黑又长的免费视频 | 亚洲人成网站18禁止久久影院| 日韩一级在线播放免费观看| 男女一进一出抽搐免费视频 | 成人免费av一区二区三区| 亚洲美女视频一区| 全黄性性激高免费视频| 久久久久国产精品免费免费不卡| 亚洲老熟女五十路老熟女bbw| 色噜噜AV亚洲色一区二区| 99热在线精品免费全部my| 久久免费香蕉视频| 亚洲精品无码久久久久YW| 亚洲三级电影网站| 亚洲成a人片在线播放| 国产91色综合久久免费分享| 一级美国片免费看| 国产成人精品亚洲日本在线| 亚洲情XO亚洲色XO无码| 拔擦拔擦8x华人免费久久| 1000部啪啪毛片免费看| 一个人看的免费高清视频日本 | 中文在线免费视频| 国产区图片区小说区亚洲区| 亚洲成aⅴ人片在线影院八| 国产AV无码专区亚洲AWWW| 国产大片线上免费看| 毛片A级毛片免费播放| 四虎影视成人永久免费观看视频| 免费很黄无遮挡的视频毛片| 亚洲综合久久精品无码色欲| 久久亚洲AV午夜福利精品一区| 亚洲阿v天堂在线2017免费| 四虎成人免费大片在线| 国产精品免费网站| 特级无码毛片免费视频尤物|