List迭代時修改元素的問題
請編寫代碼完成以下需求:
判斷一個List里面是否包含monkey,如果包含的話,向集合中添加1024這個字符串。‘
package com.monkey1024.list; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * 判斷一個List里面是否包含monkey,如果包含的話,向集合中添加1024這個字符串。 * */ //通過注解去除黃色警告 @SuppressWarnings({ "rawtypes", "unchecked" }) public class ListTest02 { public static void main(String[] args) { List list = new ArrayList(); list.add("a"); list.add("b"); list.add("monkey"); list.add("d"); list.add("e"); Iterator iter = list.iterator(); while(iter.hasNext()) { String str = (String)iter.next();//ConcurrentModificationException並發修改異常 if(str.equals("monkey")) { list.add("1024"); } } } }
上面代碼在向list中添加完元素之后再執行到String str = (String)iter.next();這行時,報出ConcurrentModificationException異常,通過ArrayList的源碼可以看到,當modCount不等於expectedModCount時才會報出這個異常,上面代碼在遍歷集合時添加了一個元素,這樣就修改了集合中的元素個數,所以會導致modCount不等於expectedModCount,這樣就會報出ConcurrentModificationException異常。
如果想要解決上面的問題,需要使用ListIterator去遍歷,並且使用ListIterator向List中添加元素
package com.monkey1024.list; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /** * 使用ListIterator解決ConcurrentModificationException * */ // 通過注解去除黃色警告 @SuppressWarnings({ "rawtypes", "unchecked" }) public class ListTest02 { public static void main(String[] args) { List list = new ArrayList(); list.add("a"); list.add("b"); list.add("monkey"); list.add("d"); list.add("e"); // 使用ListIterator解決上面的問題 ListIterator listIter = list.listIterator(); while (listIter.hasNext()) { String str = (String) listIter.next(); if (str.equals("monkey")) { // 使用list迭代器向集合中添加元素 listIter.add("1024"); } } System.out.println(list); } }
ListIterator中方法簡介
在ListIterator中有個previous()和hasPrevious()方法,通過這兩個方法,可以將集合中的元素倒序遍歷。需要注意的是在倒序遍歷之前要將集合先正序遍歷。
package com.monkey1024.list; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; /** * ListIterator * */ //通過注解去除黃色警告 @SuppressWarnings({ "rawtypes", "unchecked" }) public class ListIteratorTest01 { public static void main(String[] args) { List list = new ArrayList(); list.add("a"); list.add("b"); list.add("world"); list.add("c"); list.add("d"); list.add("e"); ListIterator listIter = list.listIterator(); while(listIter.hasNext()) { System.out.println(listIter.next());//獲取元素並將指針向后移動 } System.out.println("-----------------"); while(listIter.hasPrevious()) { System.out.println(listIter.previous()); //獲取元素並將指針向前移動 } } }