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

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

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

    夢幻之旅

    DEBUG - 天道酬勤

       :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks
    問題:
    下面的代碼試圖利用
    HashMap的Iterator對象遍歷該HashMap并刪除滿足條件的元素(比如超時的元素),但會拋出java.util.ConcurrentModificationException異常
        public static void main(String[] args)
            
            HashMap<String, String> hs=new HashMap();    
            hs.put("p1", "1");
            hs.put("p2", "1");
            hs.put("p3", "1");
            hs.put("p4", "1");
            hs.put("p5", "1");
            hs.put("p6", "1");       
            Iterator it=hs.keySet().iterator();      
            while(it.hasNext())
            {
                String str=(String)it.next();               
                System.out.println(hs);   

                 //邏輯處理.........         
                 .............
                hs.remove(str);      
             
    }
        原因應該
    hs.remove(str)后,it內容沒變,并且it里的指針列表又重新排序,所以只要確保刪除任一元素后,it保持同步更新即可:
        解決方案一:
    刪除任一元素后,it保持同步更新
        ............
          
    Iterator it=hs.keySet().iterator();   
            while(it.hasNext())
            {
                it=hs.keySet().iterator();  
                String str=(String)it.next();               
                System.out.println(hs);   

                 //邏輯處理.........         
                 .............
                hs.remove(str);      
             

        ...........
        這樣的時間復雜度明顯太大(兩層循環嵌套)
        解決方案二:
    由于刪除元素時,hs的iterator對象也重新排序,所以只要用hs的一個副本hsBack
    Uackp的iterator去遍歷hs即可,這樣在刪除hs元素時iterator就不會重排了(因為刪除的是hs的元素,而不是該iterator所屬的
    hsBackUackp
    ...................
            hsBackUp=(HashMap<String, String>)hs.clone();
            Iterator it=hsBackUp.keySet().iterator();
            System.out.println(hsBackUp);
            while(it.hasNext())
            {
                String str=(String)it.next();               
                System.out.println(hs);               
                hs.remove(str);       
             
    .....................
        這樣雖然時間復雜度小了(只有一層循環),可是空間復雜度大了(多了一個hashmap的拷貝);
        查閱api文檔和相關資料后,原來iterator對象有一remove方法:
    void remove()       
    Removes from the underlying collection the last element returned by the
    iterator (optional operation). This method can be called only once per
    call to
    next. The behavior of an iterator is unspecified if
    the underlying collection is modified while the iteration is in
    progress in any way other than by calling this method.

    于是有下面的改進:
    解決方案三:
    ..............................
    Iterator it=hs.keySet().iterator();
    while(it.hasNext())
    {
    String str=(String)it.next();
    System.out.println(hs);
    it.remove();
    }
    ..............................
    posted on 2011-11-05 01:42 HUIKK 閱讀(16123) 評論(1)  編輯  收藏 所屬分類: Java

    評論

    # re: 利用java迭代器Itetator遍歷并刪除HashMap中的元素問題 2014-11-25 09:47 柳qing
    本來簡單的東西被樓主講復雜了。。。  回復  更多評論
      

    主站蜘蛛池模板: jizzjizz亚洲日本少妇| 亚洲国产成人在线视频| 疯狂做受xxxx高潮视频免费| 男男AV纯肉无码免费播放无码| 91亚洲导航深夜福利| a在线视频免费观看| 亚洲真人无码永久在线| 72pao国产成视频永久免费| 久久久久亚洲?V成人无码| 久久一区二区免费播放| 亚洲国产精品无码久久久秋霞2| 日韩精品无码免费专区午夜| 亚洲AV无码成人精品区蜜桃| 免费的全黄一级录像带| 亚洲人成依人成综合网| 成人影片麻豆国产影片免费观看| 亚洲综合欧美色五月俺也去| 嫩草影院在线免费观看| 一二三四在线观看免费中文在线观看| 亚洲线精品一区二区三区影音先锋| 国产色爽免费无码视频| 亚洲伊人色一综合网| 日本媚薬痉挛在线观看免费| 黄页网站在线免费观看| 国产av无码专区亚洲av桃花庵| 国产精品成人观看视频免费| 亚洲欧美成人综合久久久| 亚洲人成网站在线观看青青| 国产精品免费无遮挡无码永久视频| 国产精品免费久久久久电影网| 精品国产人成亚洲区| 无码精品国产一区二区三区免费| 亚洲国产视频久久| 亚洲国产黄在线观看| 久久久久久毛片免费播放| 亚洲国产高清国产拍精品| 亚洲线精品一区二区三区| 性感美女视频免费网站午夜| jizz中国免费| 亚洲国产熟亚洲女视频| 亚洲精品自产拍在线观看|