<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
    本來簡單的東西被樓主講復雜了。。。  回復  更多評論
      

    主站蜘蛛池模板: 一级毛片人与动免费观看| xxxxx做受大片在线观看免费| 国产成人无码精品久久久久免费| 国产一级高青免费| 在线观看的免费网站无遮挡| 国产成人免费爽爽爽视频| 国产成人精品日本亚洲专区| 亚洲精品免费在线观看| 一本色道久久88亚洲精品综合 | 黄网站色视频免费在线观看的a站最新| 91热成人精品国产免费| 日韩免费视频在线观看| 亚洲人成人77777网站| 亚洲精品又粗又大又爽A片| 国产啪精品视频网站免费尤物| 日本不卡高清中文字幕免费| 日日摸日日碰夜夜爽亚洲| 2015日韩永久免费视频播放| 国产精品亚洲w码日韩中文| 中国一级毛片视频免费看| 亚洲91av视频| 韩国免费a级作爱片无码| 亚洲ⅴ国产v天堂a无码二区| 97在线线免费观看视频在线观看| 亚洲av无码一区二区三区网站| 怡红院亚洲红怡院在线观看| 国产亚洲?V无码?V男人的天堂| 亚洲成AV人片高潮喷水| 69成人免费视频| 亚洲最大在线观看| 午夜视频在线免费观看| 亚洲国产精品久久久天堂| 一个人看的免费视频www在线高清动漫 | 成人毛片18女人毛片免费| 亚洲一区精品中文字幕| 中文字幕版免费电影网站| 亚洲精品在线视频观看| 免费无码VA一区二区三区 | 免费大片在线观看网站| 亚洲真人无码永久在线观看| 免费一级国产生活片|