零全零美(www.zzgwt.com)
          生活中的很多事情,并不像If...Else那么簡單!
          posts - 96,comments - 52,trackbacks - 0

          當使用 fail-fast iterator 對 Collection 或 Map 進行迭代操作過程中嘗試直接修改 Collection / Map 的內容時,即使是在單線程下運行, java.util.ConcurrentModificationException 異常也將被拋出。

            Iterator 是工作在一個獨立的線程中,并且擁有一個 mutex 鎖。 Iterator 被創建之后會建立一個指向原來對象的單鏈索引表,當原來的對象數量發生變化時,這個索引表的內容不會同步改變,所以當索引指針往后移動的時候就找不到要迭代的對象,所以按照 fail-fast 原則 Iterator 會馬上拋出 java.util.ConcurrentModificationException 異常。

            所以 Iterator 在工作的時候是不允許被迭代的對象被改變的。但你可以使用 Iterator 本身的方法 remove() 來刪除對象, Iterator.remove() 方法會在刪除當前迭代對象的同時維護索引的一致性。

            有意思的是如果你的 Collection / Map 對象實際只有一個元素的時候, ConcurrentModificationException 異常并不會被拋出。這也就是為什么在 javadoc 里面指出: it would be wrong to write a program that depended on this exception for its correctness: ConcurrentModificationException should be used only to detect bugs.

          使用LinkedIterator解決,LinkedIterator有add方法,可以向迭代對象中添加數據

          在使用Foreach迭代時,如果使用如果刪除元素,也會發生異常,

          posted on 2008-04-18 00:33 零全零美 閱讀(195) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 大埔县| 朔州市| 张家口市| 苍梧县| 平定县| 湖南省| 财经| 河西区| 苏尼特左旗| 岑溪市| 雷州市| 铁力市| 青浦区| 连山| 郯城县| 永嘉县| 大石桥市| 涿州市| 罗源县| 博客| 淳安县| 固阳县| 咸宁市| 乌拉特后旗| 兴文县| 黔南| 辽阳市| 芜湖市| 和林格尔县| 芦溪县| 临澧县| 泸定县| 曲麻莱县| 扎鲁特旗| 三河市| 南郑县| 共和县| 永州市| 红安县| 河间市| 伊宁县|