先說說使用for each 的list遍歷,假設(shè)list是字符串集合
for(String str:list){
....
}
假如需求來了霞掺,要求刪除集合中特定的字符串谊路,你也許會這么做
for(String str:list){
...
if(str.equal("")){
list.remove(str);
}
...
}
這種需求很常見,那么我們運行一下
看到?jīng)]菩彬,報了java.util.ConcurrentModificationException的異常缠劝。
我們來分析一下,問題其實出在for each的遍歷上骗灶,通過反編譯我們很清楚for each對list的遍歷其實如下
Iterator<String > iterator = list.iterator();
while(iterator.hasNext()){
String str = iterator.next();
}
沒錯惨恭,是用的迭代器。
加入在循環(huán)體中使用list.remove 的方法耙旦,那么list會減少一項脱羡,但是itertor的數(shù)據(jù)并不會減少。免都。
那么你會問轻黑,既然不影響itertor,那么更不會報錯咯琴昆?
狗血的是:
迭代器每次next獲取數(shù)據(jù)時氓鄙,都會判斷自身是否和list相同,如果不同业舍,拋出java.util.ConcurrentModificationException異常抖拦,現(xiàn)在你知道是什么原因了吧???
那么怎么解決上面需求舷暮,其實itertor也有remove的方法态罪,具體實現(xiàn)你們自己去敲代碼,我先睡覺了下面,??