publicstaticvoidmain(String[] args){
List<String> list=newArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");for(String str : list){if(str=="d"){
list.remove(str);}}
System.out.println(list);}//报错
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
at java.util.ArrayList$Itr.next(Unknown Source)
at com.cc.JVM.memory.test.main(test.java:21)
2. 原因
进入 remove 方法,在 fastRemove 中执行了 modCount++
publicclassArrayList<E>extendsAbstractList<E>implementsList<E>, RandomAccess, Cloneable, java.io.Serializable
{//...publicbooleanremove(Object o){if(o == null){for(int index =0; index < size; index++)if(elementData[index]== null){fastRemove(index);returntrue;}}else{for(int index =0; index < size; index++)if(o.equals(elementData[index])){fastRemove(index);returntrue;}}returnfalse;}privatevoidfastRemove(int index){
modCount++;int numMoved = size - index -1;if(numMoved >0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size]= null;// clear to let GC do its work}//...}
publicclassArrayList<E>extendsAbstractList<E>implementsList<E>, RandomAccess, Cloneable, java.io.Serializable
{privateclassItrimplementsIterator<E>{int cursor;// index of next element to returnint lastRet =-1;// index of last element returned; -1 if no suchint expectedModCount = modCount;Itr(){}publicbooleanhasNext(){return cursor != size;}@SuppressWarnings("unchecked")public E next(){checkForComodification();int i = cursor;if(i >= size)thrownewNoSuchElementException();
Object[] elementData = ArrayList.this.elementData;if(i >= elementData.length)thrownewConcurrentModificationException();
cursor = i +1;return(E) elementData[lastRet = i];}//...finalvoidcheckForComodification(){if(modCount != expectedModCount)thrownewConcurrentModificationException();}}}