喜歡就扣1支持吧
我在之前的一個文章裏介紹過迭代器Iterator,不瞭解迭代器的可以看下
名詞解釋
modCount :實際修改集合的次數
expectedModCount :預期修改集合的次數
ConcurrentModificationException:併發修改異常
異常發生條件
- 當實際修改集合的次數 不等於 預期修改集合的次數時,提示併發修改異常
- 迭代器遍歷的過程中 ,通過集合對象修改了集合中元素的長度, 造成了迭代器獲取元素中判斷預期修改值和實際修改值不一致
解決方案
- 方案一:用for循環遍歷, 然後用集合對象做對應的操作即可
- 方案二:使用列表迭代器(ListIterator)使用前提必須時List集合
列表迭代器(ListIterator)
- 通過List集合的listlterator()方法得到, 所以它是List集合特有的迭代器
- 用於允許程序員沿任一方向遍歷列表的列表迭代器, 在迭代期間修改列表,並獲取列表中迭代器的當前位置
Listlterator中的常用方法
方法 | 說明 |
---|---|
E next() | 返回迭代中的下一一個元素 |
boolean hasNext() | 如果迭代具有更多元素,則返回true |
E previous() | 返回列表中的上一個元素 |
boolean hasPrevious() | 如果此列表迭代器在相反方向遍歷列表時具有更多元素,則返回true |
void add(E e) | 將指定的元素插入列表 |
Listlterator與Iterator代碼樣例
import java.util.*;
public class Dmeo {
public static void main(String[] args) {
//創建集合對象
List<String> list = new ArrayList<String>();
//添加元素
list.add("hello");
list.add("world");
//併發修改異常,創建Iterator迭代器對象
// Iterator<String> iterator = list.iterator();
// while (iterator.hasNext()) {
// String x = iterator.next();
// if(x.equals("world")) {
// list.add("javaee");
// }
// }
//方法一
//for循環方式解決
for(int i=0; i<list.size(); i++) {
String s = list.get(i);
if(s.equals("world")) {
list.add("java");
}
}
//方法二
//通過list集合的listIterator ()方法得到ListIterator列表迭代器對象
ListIterator<String> listIterator = list.listIterator();
while (listIterator.hasNext()) {
String x = listIterator.next();
if(x.equals("world")) {
//注意,這裏使用listIterator列表迭代器對象的add方法添加
listIterator.add("java");
}
}
System.out.println(list);
}
}