為什麼不能在增強for中刪除集合的元素

2022-02-08 12:43:00 字數 1265 閱讀 7361

學習的過程中遇到的乙個問題, 下述**在嘗試remove其他元素的時候會出現異常,而在remove最後乙個元素的時候,可以正常執行.

public class main }}

}

初步查詢後得知,增強for和迭代器遍歷的過程中,直接用集合去remove以及其他修改集合的操作很容易出現問題.

之後debug+翻原始碼分析了一下異常丟擲的原因:

異常是在treemap中的乙個繼承iterator的抽象類中丟擲的

next()方法原始碼如下

throw new concurrentmodificationexception();這行丟擲異常原因顯然是因為if條件滿足modcount != expectedmodcount雖然不知道為什麼jdk這樣設計的.這兩個變數在treemap類的成員變數中定義,沒搞懂是幹嘛的.先繼續往下找找什麼操作會導致這兩個變數的變化.

final entrynextentry()
在remove()方法中發現呼叫了deleteentry方法,該方法修改了導致異常丟擲的條件的變數.

remove()方法導致變數值修改的核心部分

private void deleteentry(entryp)
目前到這裡,僅僅是大致上搞懂了為什麼當使用集合的remove方法移除元素的時候會拋異常這點.還有乙個問題有待解決,當移除最後乙個元素的時候卻沒有丟擲異常.

回頭檢查自己的**.增強for在編譯後會變成迭代器.反編譯後的**如下.

iteratorvar3=set.iterator();

while(var3.hasnext())

}

從這裡猜測會不會和**按順序執行有關,當remove最後乙個元素後,下一行要執行的是hasnext,當hasnext執行完後返回false後迴圈會直接結束,而不進入next方法.並且異常可能只能是next方法丟擲的.

所以順便查了下hasnext的原始碼.在此之中果然沒有丟擲異常的語句.

hasnext()方法的原始碼

public final boolean hasnext()
最後得到的結論就是,不要在增強for和迭代器遍歷中直接刪除集合的元素.如果沒拋異常可能就是因為刪除的是最後乙個元素.

增強for為什麼不能刪除集合裡的元素

1.先看看arraylist物件呼叫iterator 返回的iterator物件 public iterator iterator 1232.再看看arraylist中實現iterator的內部類itr private class itr implements iterator 12345 3.看迭...

為什麼不能在函式中申請大陣列?

1.簡而言之,陣列定義在函式中時,占用的記憶體來自棧空間,棧空間是在程序建立時初始化的,有固定的大小,一般很小,所以太大的陣列會耗光棧空間。全域性變數一般分配在資料段,可以比較大。2.bbs段 資料段 段 堆與棧及5大記憶體分配 bss段 block started by symbol bss段 b...

為什麼不能在ISR中進行任務切換

吾日三省吾身 為人謀而不忠乎?與朋友交而不信乎?傳不習乎?在學習ucosiii的時候時常遇到下面的一段 能看懂,它的意思就是不允許在中斷中進行任務排程,但是就是不知道為什麼要這樣設定,今天仔細想了一下,同時上網搜了一下,得到答案 如果我們在中斷中切換到別的地方去執行,由於isr並沒有向作業系統核心報...