public void remove() { if (lastRet == -1) throw new IllegalStateException(); checkForComodification(); try { AbstractList.this.remove(lastRet); if (lastRet < cursor) cursor--; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException e) { throw new ConcurrentModificationException(); } }
在這個方法中,刪除元素實際上調用的就是list.remove()方法,可是它多了一個操做:android
expectedModCount = modCount;
所以,在迭代器中若是要刪除元素的話,須要調用Itr類的remove方法。多線程
將上述代碼改成下面這樣就不會報錯了:ide
public class Test { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<Integer>(); list.add(2); Iterator<Integer> iterator = list.iterator(); while(iterator.hasNext()){ Integer integer = iterator.next(); if(integer==2) iterator.remove(); //注意這個地方 } } }
List<String> myList = new CopyOnWriteArrayList<String>(); myList.add( "1"); myList.add( "2"); myList.add( "3"); myList.add( "4"); myList.add( "5"); new Thread(new Runnable() { @Override public void run() { for (String string : myList) { System.out.println("遍歷集合 value = " + string); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < myList.size(); i++) { String value = myList.get(i); System.out.println("刪除元素 value = " + value); if (value.equals( "3")) { myList.remove(value); i--; // 注意 } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); --------------------- 做者:love_world_ 來源:CSDN 原文:https://blog.csdn.net/androiddevelop/article/details/21509345 版權聲明:本文爲博主原創文章,轉載請附上博文連接!