迭代器併發修改異常(ConcurrentModificationException)與列表迭代器(ListIterator)——每天一個Java小常識

喜歡就扣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);
		
	}
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章