由該鏈接引發的思考: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中提到(在創建迭代器之后,除非通過迭代器自身的 remove 或 add 方法從結構上對
列表進行修改,否則在任何時間以任何方式對列表進行修改,迭代器都會拋出 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() 方法會在刪除當前迭代對象的同時維護索引的一致性 |