探討迭代器中為什么不能通過集合的方式刪元素而是使用迭代器中的remove()方法經行刪除


由該鏈接引發的思考:http://bbs.itheima.com/forum.php?mod=viewthread&tid=26270&mobile=1

看到這篇文章后,一副似懂非懂的樣子,果斷將樓主的代碼拷貝到eclipse中運行了下,果斷發現了些問題。

經過測試,發現總是在當集合中倒數第二個滿足條件時程序才可以正常運行,否則,就會拋出ConcurrentModificationException異常

然后,我在while{it.hasNext()){和String str = (Strign)it.next()處設置了斷點:——經行debug查找:

 

當程序拋出異常時總是執行到it.next()處發生:API中提到(在創建迭代器之后,除非通過迭代器自身的 removeadd 方法從結構上對

列表進行修改,否則在任何時間以任何方式對列表進行修改,迭代器都會拋出 ConcurrentModificationException。),也就是當發生了

如下圖中modCount(記錄了對集合修改的次數)的值不等於expectedModCount(通過迭代器對集合修改的次數)的值會拋異常。

 

反之,如果程序仍能正常運行的話,那么唯一的解釋就是,該語句並沒有執行到next這條語句塊中

程序運行后發現如圖:

也就是size的值等於cursor的值時,程序不會在執行while當中的內容,因此不會發生異常就結束。即——該判斷標准中it.hasNext()

是否返回true的標准就是size!=cursor時成立。

最后附上網上的判斷——

Iterator 是工作在一個獨立的線程中,並且擁有一個 mutex 鎖。 Iterator 被創建之后會建立一個指向原來對象的單鏈索引表,當原來的對象數量發生變化時,這個索引表的內容不會同步改變,所以當索引指針往后移動的時候就找不到要迭代的對象,所以按照 fail-fast 原則 Iterator 會馬上拋出 java.util.ConcurrentModificationException 異常。
所以 Iterator 在工作的時候是不允許被迭代的對象被改變的。但你可以使用 Iterator 本身的方法 remove() 來刪除對象, Iterator.remove() 方法會在刪除當前迭代對象的同時維護索引的一致性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM